【问题标题】:Accessing touch events in a global monitor throws an error在全局监视器中访问触摸事件会引发错误
【发布时间】:2018-11-17 12:59:33
【问题描述】:

我正在编写一个 MacOs 应用程序,我试图在触控板上获取触摸的位置。例如,左下角为 0,0,右上角为 100,100。

我想从我的应用程序中获取发生触摸的信息,所以我正在使用全局监视器。

我找到了一些信息并阅读了官方文档(令人印象深刻的缺乏示例),但我仍然可以让它工作。每当我尝试从事件中访问方法 allTouches() 时都会收到错误消息。代码如下:

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.leftMouseDown) {event in
            let touch = event.allTouches()
        }
    }
}

我收到以下错误:

2018-11-17 12:49:08.693873+0000 App[76030:1935325] [default] Unable to load Info.plist exceptions (eGPUOverrides)
2018-11-17 12:49:09.910842+0000 App[76030:1935325] *** Assertion failure in -[NSEvent touchesMatchingPhase:inView:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1671/AppKit.subproj/NSEvent.m:4752
2018-11-17 12:49:09.910996+0000 App[76030:1935325] [General] An uncaught exception was raised
2018-11-17 12:49:09.911019+0000 App[76030:1935325] [General] Invalid message sent to event "NSEvent: type=LMouseDown loc=(760.789,273.406) time=414257.3 flags=0 win=0x0 winNum=42380 ctxt=0x0 evNum=30352 click=1 buttonNumber=0 pressure=1 deviceID:0x200000001000000 subtype=NSEventSubtypeTouch"
2018-11-17 12:49:09.913059+0000 App[76030:1935325] [General] (
    0   CoreFoundation                      0x00007fff32b6943d __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff5ea76720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff32b8408e +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00007fff34f2055d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4   AppKit                              0x00007fff303e3cd2 -[NSEvent touchesMatchingPhase:inView:] + 494
    5   App                             0x00000001000018a2 _T07App14ViewControllerC11viewDidLoadyyFySo7NSEventCcfU_ + 34
    6   App                             0x0000000100001c4e _T0So7NSEventCIxx_ABIyBy_TR + 62
    7   AppKit                              0x00007fff3063f2b5 GlobalObserverHandler + 117
    8   HIToolbox                           0x00007fff31d468d9 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1502
    9   HIToolbox                           0x00007fff31d45c16 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 371
    10  HIToolbox                           0x00007fff31d45a9c SendEventToEventTargetWithOptions + 45
    11  HIToolbox                           0x00007fff31d62c54 _ZL29ToolboxEventDispatcherHandlerP25OpaqueEventHandlerCallRefP14OpaqueEventRefPv + 1336
    12  HIToolbox                           0x00007fff31d46d0c _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2577
    13  HIToolbox                           0x00007fff31d45c16 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 371
    14  HIToolbox                           0x00007fff31d631cd SendEventToEventTarget + 39
    15  AppKit                              0x00007fff30005b36 _DPSNextEvent + 1472
    16  AppKit                              0x00007fff300046fa -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362
    17  AppKit                              0x00007fff2fffe75d -[NSApplication run] + 699
    18  AppKit                              0x00007fff2ffede97 NSApplicationMain + 780
    19  App                             0x00000001000039ed main + 13
    20  libdyld.dylib                       0x00007fff5fb44085 start + 1
)

我做错了什么,我该如何解决?

【问题讨论】:

  • 错误是什么?
  • @Willeke 我已经用错误日志更新了问题。我也已经浏览了您链接的那个文档,但我无法解决那里的信息问题。我在 Swift 中找不到任何示例这一事实让我更难
  • “您无法将鼠标事件与任何特定的触摸相关联”意味着您无法触摸 mousedown 事件。
  • 那我应该使用什么 EventTypeMask?文档真的很糟糕,我根本找不到任何例子

标签: swift macos cocoa touch trackpad


【解决方案1】:

allTouches 对鼠标按下事件无效,仅在 NSEventTypeGesture 事件中有效,如头文件中的注释所述:

/* Only valid for NSEventTypeGesture events. Equivalent to [event
touchesMatchingPhase:NSTouchPhaseAny inView:nil] */
- (NSSet <NSTouch *> *)allTouches NS_AVAILABLE_MAC(10_12);

对于NSEvent.EventTypeMask.leftMouseDown,您要求收到以下通知,这些是您可能想要访问的主要属性:

/* these messages are valid for all mouse down/up/drag events */
@property (readonly) NSInteger clickCount;
@property (readonly) NSInteger buttonNumber;    // for NSOtherMouse events, but will return valid constants for NSLeftMouse and NSRightMouse
…
/* -pressure is valid for all mouse down/up/drag events, and is also valid for NSEventTypeTabletPoint events on 10.4 or later and NSEventTypePressure on 10.10.3 or later */
@property (readonly) float pressure;
/* -locationInWindow is valid for all mouse-related events */
@property (readonly) NSPoint locationInWindow;

如果您真的想获得手势,请使用NSEventTypeGesture 掩码。然后你可以使用allTouchestouchesForView。请注意,您可能需要区分与手势滚动相关的事件和其他手势,具体取决于您的情况和目标。

【讨论】:

  • 你能告诉我你是如何设置面具的吗?我正在尝试创建一个 NSGestureRecognizer 并且需要获取我的点击位置并遇到相同的问题
  • @DuncanWatts 如果您发布了一个完整的问题,那么可能最简单,因此需要回答它(和代码)的上下文存在。请随时在您的问题的评论中标记我,如果我能抽出时间,我会看看。
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多