【发布时间】:2020-08-10 12:06:10
【问题描述】:
我正在使用 Xcode(MacOS Catalina 下的 XCode 11.5)编写 macOS 应用程序,目标是通过 UDP 发送与我的 Macbook Pro 触控板接触的手指坐标,并在收到 UDP 消息时触发触觉反馈.
作为 Xcode 的新手,我使用this code 和SwiftOSC 创建了我的应用程序用于 UDP 通信。当应用程序在前台时,我成功地做我想做的事。
代码:正是找到here的那个。
问题:应用在后台没有更新。
更新:遵循@zrzka 的建议:
- 我用
NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.any) {event in
self.backMouseMovements(with: event)
}
在后台监听事件,功能如下:
func backMouseMovements(with event: NSEvent) {
print("Event: \(event)")
let touches = event.touches(matching: .moved, in: self)
delegate?.touchesView(self, didUpdateTouchingTouches: touches)
}
我将此代码放在this code 的AppKitTouchesView 类的override init(frame frameRect: NSRect) 中。
-
辅助功能:
AXIsProcessTrusted()返回true -
我无法通过这些事件访问
touches,更不用说normalizedPosition,这是我的最终目标。
相反,我有一个错误:
2020-08-13 09:40:53.538119+0200 TrackPad[1263:34805] *** Assertion failure in -[NSEvent touchesMatchingPhase:inView:], /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1894.50.103/AppKit.subproj/NSEvent.m:4874
2020-08-13 09:40:53.538198+0200 TrackPad[1263:34805] [General] An uncaught exception was raised
2020-08-13 09:40:53.538229+0200 TrackPad[1263:34805] [General] Invalid message sent to event "NSEvent: type=MouseMoved loc=(1197.92,994.461) time=3138.3 flags=0 win=0x0 winNum=150 ctxt=0x0 evNum=307 click=1 buttonNumber=0 pressure=0 deltaX=1.000000 deltaY=0.000000 deviceID:0x300000080500000 subtype=NSEventSubtypeTouch"
2020-08-13 09:40:53.539294+0200 TrackPad[1263:34805] [General] (
0 CoreFoundation 0x00007fff318c5be7 __exceptionPreprocess + 250
1 libobjc.A.dylib 0x00007fff6a69d5bf objc_exception_throw + 48
2 CoreFoundation 0x00007fff318eed98 +[NSException raise:format:arguments:] + 88
3 Foundation 0x00007fff33fdde9d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191
4 AppKit 0x00007fff2ee7fc36 -[NSEvent touchesMatchingPhase:inView:] + 449
5 TrackPad 0x0000000100002d0d $s8TrackPad17AppKitTouchesViewC18backMouseMovements4withySo7NSEventC_tF + 813
6 TrackPad 0x0000000100002986 $s8TrackPad17AppKitTouchesViewC5frameACSo6CGRectV_tcfcySo7NSEventCcfU_ + 214
7 TrackPad 0x0000000100002f09 $sSo7NSEventCIegg_ABIeyBy_TR + 73
8 AppKit 0x00007fff2f0a14e9 GlobalObserverHandler + 89
9 HIToolbox 0x00007fff3044f8ff _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1254
10 HIToolbox 0x00007fff3044ed8d _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 329
11 HIToolbox 0x00007fff3044ec3d SendEventToEventTargetWithOptions + 45
12 HIToolbox 0x00007fff3048eb8c _ZL29ToolboxEventDispatcherHandlerP25OpaqueEventHandlerCallRefP14OpaqueEventRefPv + 1329
13 HIToolbox 0x00007fff3044fe8a _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2673
14 HIToolbox 0x00007fff3044ed8d _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 329
15 HIToolbox 0x00007fff3046447e SendEventToEventTarget + 39
16 AppKit 0x00007fff2eabe9aa _DPSNextEvent + 1268
17 AppKit 0x00007fff2eabd070 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1352
18 AppKit 0x00007fff2eaaed7e -[NSApplication run] + 658
19 AppKit 0x00007fff2ea80b86 NSApplicationMain + 777
20 TrackPad 0x000000010000eead main + 13
21 libdyld.dylib 0x00007fff6b844cc9 start + 1
我猜这个错误是因为我想访问touches,而这些事件不存在。但是,我不明白如何在我的addGlobalMonitorForEvents 和NSTouch 的NSEvent 之间建立链接,其中normalizedPosition 可用。
谢谢!
【问题讨论】:
-
欢迎您!请使用Tour 并阅读What types of questions should I avoid asking?、What topics can I ask about here? 和How do I ask a good question?——您刚刚分享了您正在做的事情以及您正在使用的几个库/代码。但是你也应该提供你的应用程序的代码,那些不起作用的部分。我的猜测是您的应用程序只是在打盹。见my answer。
-
实际上,该应用程序在不处于后台时运行良好。我不知道应用程序可以打盹,我会读一下这个和你的答案,谢谢!
-
我将添加一段相关代码的简短摘录,而不是链接,然后解释代码如何未按预期执行/您要添加的功能。
-
如果我的理解正确,即使应用程序在后台,您也想发送触控板手指位置?实际上,我编写了您链接的代码,但它并没有以您期望的方式工作。它是为处理视图触摸而编写的。但是即使您的应用程序在后台,您也需要一个全局事件监视器来监视鼠标事件。只需搜索 SO,周围有大量示例,并将它们与我的代码结合起来计算手指位置。
-
@zrzka 没错。我想我只需要添加一行代码就可以通过 OSC 发送数据,就像这样(在代码的 struct Touch 中):
init(_ nsTouch: NSTouch) { self.normalizedX = nsTouch.normalizedPosition.x self.normalizedY = 1.0 - nsTouch.normalizedPosition.y self.id = nsTouch.hash self.position = [] client.send(OSCMessage(OSCAddressPattern("/position"), Float(normalizedX), Float(normalizedY))) }感谢您的建议!作为一个新手,我发现很难理解这是如何工作的,感谢您花时间回答:)
标签: swift macos-catalina appkit xcode11.5