2017-01-03 5 views
-1

グローバルキーダウンイベントを監視するためにインターネットからコードを収集しました。実行可能ファイルが実行されたときにキープレスイベントが記録されない

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

これは、コマンドラインアプリでなければなりませんか?通常、アプリケーションバンドル(Info.plistとアプリケーション識別子を持つもの)のみをグローバルモニタに登録することができます。おそらく、これを実行するとXcodeやTerminalを許可するかどうかを尋ねるでしょう.XcodeやTerminalは、実行しているアプリケーションだからです。 Xcodeはあなたにイベントを転送しますが、Terminalはおそらくそうではありません。

これを通常のアプリケーションバンドル(UIなしでも可)にすることができれば、それは問題ありません。

+0

ありがとうございました。私はUIなしでビルドすることで自分の仕事を完成させる唯一の方法だと思います。 – SkrewEverything

関連する問題