2016-09-22 19 views
1

私は、macOSのキーストロークをシミュレートし、アクティブなアプリケーションに送信しています。私は「A」を送信するために、例えばhttps://stackoverflow.com/a/27487493/5600424の線に沿ってなく、スウィフト3でそれをやっている:macOSのQuartzイベントでキーストロークをシミュレートするSierra

let eventSource = CGEventSource(stateID: CGEventSourceStateID.hidSystemState) 
let key: CGKeyCode = 0  // virtual key for 'a' 
let eventDown = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: true) 
let eventUp = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: false) 
let location = CGEventTapLocation.cghidEventTap 
eventDown.post(tap: location) 
eventUp.post(tap: location) 

これはOSXエルキャピタン(スウィフト3、Xcodeの8.0)に罰金働いていたが、それは停止しましたmacOs Sierraにアップデートした後に動作します。アクティブなときにアプリケーション自体がキーストロークを受信しますが、別のアプリケーションがアクティブな場合はイベントが失われているように見えます。私は成功なしに何が起こっているのか把握しようとしましたが、ドキュメンテーションは役に立たない。どんな助けもありがとう、ありがとう!

+0

「CGEventTapLocation.cgSessionEventTap」のように、別のタップ位置に投稿しようとしましたか?または、特定のアプリケーションをターゲットにしている場合は、 'postToPSN()'を使用しますか? –

+0

こんにちは@Ken、私は特定のアプリケーションを対象としていない、私はフォアグラウンドアプリケーションのアクティブなウィンドウ(ユーザーが対話している)イベントを受信したいと思います。それは私が前シエラを意図したように働いていた。私も 'CGEventTapLocation.cgSessionEventTap'を試しましたが、動作は変わりません。別のアプリケーションに切り替えると、イベントは無視されます。おそらく正しい方法は 'NSWorkspace.shared()。runningApplications.first(where:{$ 0.isActive})'でフォアグラウンドアプリケーションを追跡し、 'postToPSN()'を使うことでしょうか? – tin

+1

さて、 'NSWorkspace.shared()。frontmostApplication'を使う方が適切でしょう。 ;)確かにそれを試すことができます。また、シエラがイベントの投稿セキュリティを強化し、キーイベントのタップに必要な補助的なアクセスが必要な場合もあります。 –

答えて

1

質問で引用されたコードは正しく動作し、主張とは異なり、El CapitanからSierraにアップグレードするときの動作は変更されません。

アプリケーションがバックグラウンドになると、上記のコードでキーボードイベントを送信する機能が独立した理由でもう呼び出されなかったため、他のアプリケーションでキーストロークが受信されませんでした。

関連する問題