4

私のアプリの機能の 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()

ありがとう!

4

1 に答える 1

4

ポーリングAXIsProcessTrustedと自動再起動はいい感じです。ユーザーはこのプロセスに混乱することが多いため、ユーザーにとって簡単にするのに役立つものは何でも良い.

起動したアプリケーションが現在のアクセス許可を継承していることは確かですが、それをバックアップするための参照が手元にありません。s を使用してアプリケーションをデバッグするときにCGEventTap、アプリが要求/要求するアクセシビリティ権限を Xcode に付与する必要があることがわかりました。

ただし、システムにアプリを起動させることで、これを回避できます。試す:

[NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", [NSString stringWithFormat:@"sleep 3 ; /usr/bin/open '%@'", [[NSBundle mainBundle] bundlePath]], nil]];
于 2016-03-01T04:24:55.063 に答える