9

キーボードフックを取り付けました:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

基本的に、私はユーザーのキーボードタップを取り、入力を食べて、代わりに自分の入力を投稿したいと思います。

したがって、彼が「g」をタップした場合、テキストフィールドに「foo」を投稿したいと思うかもしれません。

私はここで見つけたようにテキストフィールドに書いていCGEventPostますCGEventSetUnicodeString:http: //www.mail-archive.com/cocoa-dev@lists.apple.com/msg23343.html

問題は、プログラムで入力した各文字がキーボードフックに当たっているということです。したがってreturn NULL、キーボードフックを使用してユーザー入力をブロックすることはできません...これにより、プログラムのすべての入力もブロックされます。

C#のWindows側で「注入された」フラグを使用してそれらを区別しました。1年前の質問を参照してください:条件として低レベルの8ビットフラグを使用するにはどうすればよいですか?

Objective-Cで似たようなものを探しています。

4

1 に答える 1

6

CGEventSource.hのコメントを見てください。イベントサービスリファレンスを使用するよりも、情報をまとめる方が少し簡単です。長いですが、より正確な方法は、イベントソースを作成するように見えます(これはメモリ管理ルールの対象ですCFRelease。プログラムの終了前に使用を終了した場合は、イベントソースを作成する必要があります)。

myEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);

これにより、一意のIDを使用して独自のプライベートイベントソースが作成されます。次に、作成したイベントがそこから発生したことを示します。

CGEventRef myKeyboardEvent = CGEventCreateKeyboardEvent(myEventSource, 
                                                        keyCode, true);

イベントが発生したら、それが自分からのものかどうかを確認します。

 if( (CGEventGetType(newEvent) == kCGEventKeyDown) &&
     (CGEventGetIntegerValueField(newEvent, kCGEventSourceStateID) == CGEventSourceGetSourceStateID(myEventSource) ) {

必要に応じて、任意の64ビットを渡すことができるソースのユーザーデータフィールドもあります。

手っ取り早い方法は、キーボードイベントにとって意味のある値ではない可能性が高いイベントフィールドを選択して、次のようkCGMouseEventPressureに署名に変換することです。

CGEventSetIntegerValueField(myKeyboardEvent, 
                            kCGMouseEventPressure, 
                            0xFEEDFACE);
// The field is an int_64 so you could make the sig longer
于 2011-04-30T18:48:54.903 に答える