我从互联网上收集了一些代码来监控全球关键事件。
当我通过Xcode运行时,它工作正常。问题是当我通过终端运行它时,它不会捕获任何事件。我已在Xcode和Terminal的设置中启用了辅助功能。
以下是代码:
func handlerEvent(aEvent: (NSEvent!)) -> Void {
let stringBuilder = aEvent.characters!
print(stringBuilder, separator: "", terminator: "")
}
// MARK: Event Monitor
func listenForEvents() {
let mask = (NSEventMask.keyDown)
_ = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handlerEvent)
}
func acquirePrivileges() -> Bool {
let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String : true]
let accessEnabled = AXIsProcessTrustedWithOptions(options)
if !accessEnabled {
print("Access Denied")
}
return accessEnabled
}
class ApplicationDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
if acquirePrivileges()
{
print("Access Granted")
}
print("Starting logging")
listenForEvents()
}
}
let application = NSApplication.shared()
let applicationDelegate = ApplicationDelegate()
application.delegate = applicationDelegate
application.activate(ignoringOtherApps: true)
application.run()
答案 0 :(得分:0)
这是否必须是命令行应用程序?您通常只能将应用程序包(即具有Info.plist和应用程序标识符的内容)注册到全局监视器。你可能会注意到,当你运行它时,它要求授权Xcode或终端,因为那是你正在运行的应用程序。 Xcode将事件转发给您,终端可能没有。
如果您可以将其设为常规应用程序包(即使没有UI),也应该没问题。