我的应用程序的一项功能是检测keyDown
事件并为某些特定键做一些事情。
所以,我CGEventTapCreate
用来解决我的问题,我的代码是这样的:
if let tap = CGEventTapCreate(.CGHIDEventTap, .HeadInsertEventTap, .Default, CGEventMask(1 << CGEventType.KeyDown.rawValue), callBack, nil) {
let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopDefaultMode)
CGEventTapEnable(tap, true)
CFRunLoopRun()
}
另外,我处理流程信任,例如:
let options = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString: false]
let processTrusted = AXIsProcessTrustedWithOptions(options)
if processTrusted {
// do CGEventTapCreate()
} else {
// check again 1s later
performSelector("checkMethod", withObject: nil, afterDelay: 1)
}
它将每秒调用一次,直到 processTrusted 为真。
然后奇怪的事情发生了:
当我在 Xcode 中运行应用程序并在 Privacy_Accessibility 中添加信任 Xcode 时,一切正常。但是当我将应用程序存档并运行
Export as a Mac Application
到我的桌面时,CGEventTapCreate() 就不起作用了。
之后我在 10.9 上以编程方式找到了这篇文章 Enable access for assistant devices,它注意到我需要在之后重新启动该应用程序AXIsTrustedProcess()
。
你知道,告诉用户自己重新启动应用程序并不是一个好主意。所以我尝试以编程方式重新启动它并将这些代码添加到if processTrusted {}
:
NSWorkspace.sharedWorkspace().launchApplication(NSProcessInfo.processInfo().processName)
NSApplication.sharedApplication().terminate(nil)
换句话说,当我勾选应用程序时Privacy_Accessibility
,它会自动重新启动。
另一个奇怪的事情来了:
该应用程序真正终止并自动启动。但是当它完成重新启动时,应用程序的 Privacy_Accessibility 没有勾选。
这真的让我很困惑,我希望有人能告诉我处理流程信任和正确执行的CGEventTapCreate()
正确方法。
谢谢!