私のアプリの機能の 1 つは、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 が true になるまで、1 秒ごとに呼び出されます。
その後、奇妙なことが起こりました:
Xcode でアプリを実行し、信頼の Xcode を Privacy_Accessibility に追加すると、すべて正常に動作します。しかし、アプリをアーカイブ
Export as a Mac Application
してデスクトップに実行すると、CGEventTapCreate() が機能しません。
その後、10.9でプログラムによって補助デバイスへのアクセスを有効にするというこの投稿を見つけましたAXIsTrustedProcess()
。
ユーザーに自分でアプリを再起動するように指示するのは得策ではありません。そこで、プログラムで再起動して、これらのコードを に追加しようとしましたif processTrusted {}
:
NSWorkspace.sharedWorkspace().launchApplication(NSProcessInfo.processInfo().processName)
NSApplication.sharedApplication().terminate(nil)
つまり、 でアプリにチェックを入れると、Privacy_Accessibility
自動的に再起動します。
ここに別の奇妙なことがあります:
アプリは本当に終了し、自動的に起動します。しかし、再起動が完了すると、アプリの Privacy_Accessibility はチェックされません。
本当に混乱しています。誰かがプロセスの信頼に対処し、正しく実行する正しい方法を教えてくれることを願っていますCGEventTapCreate()
。
ありがとう!