在运行可执行文件时不记录按键事件

时间:2017-01-03 12:42:51

标签: swift macos

我从互联网上收集了一些代码来监控全球关键事件。

当我通过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()

1 个答案:

答案 0 :(得分:0)

这是否必须是命令行应用程序?您通常只能将应用程序包(即具有Info.plist和应用程序标识符的内容)注册到全局监视器。你可能会注意到,当你运行它时,它要求授权Xcode或终端,因为那是你正在运行的应用程序。 Xcode将事件转发给您,终端可能没有。

如果您可以将其设为常规应用程序包(即使没有UI),也应该没问题。