3

次のようなバックグラウンド アプリにエンター キーを送信しようとしています。

CGEventRef a = CGEventCreateKeyboardEvent(eventSource, 36, true);
CGEventRef b = CGEventCreateKeyboardEvent(eventSource, 36, false);
CGEventPostToPSN(&psn, a);
CGEventPostToPSN(&psn, b);

機能していません。キーストロークを受け取るには、アプリが最前面にある必要があるためだと思いますか? 私は正しいですか?もしそうなら、最初にアプリをアクティブにせずにこのイベントを送信できる方法はありますか? そうでない場合、私は何が間違っていますか?ありがとう。

4

1 に答える 1

3

バックグラウンドにあるアプリは、重要なイベントには作用しません。アプリがバックグラウンドにあるときにそれらを処理するには、イベント タップとの 2 つのオプションがあります+[NSEvent addLocalMonitorForEventsMatchingMask:]NSEventオプションはとても簡単です:

// A block callback to handle the events
NSEvent * (^monitorHandler)(NSEvent *);
monitorHandler = ^NSEvent * (NSEvent * theEvent){
    NSLog(@"Got a keyDown: %d", [theEvent keyCode]);
    // The block can return the same event, a different 
    // event, or nil, depending on how you want it to be 
    // handled later. In this case, being in the background, 
    // there won't be any handling regardless.
    return theEvent;
};

// Creates an object that we don't own but must keep track of to
// remove later (see docs). Here, it is placed in an ivar.
monitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask 
                                                handler:monitorHandler];

しかし、あなたはすでにイベントタップをいじっているので、そのルートに行きたいだけかもしれません.

// Creates an object that must be CFRelease'd when we're done
CFMachPortRef tap = CGEventTapCreateForPSN(myOwnPSN, 
                                       kCGTailAppendEventTap,
                                       kCGEventTapOptionDefault, 
                                       kCGEventKeyDown,
                                       myEventTapCallback, 
                                       NULL);

コールバックは簡単です。詳細については、イベント サービス リファレンスのコールバックを参照してください。

于 2011-05-21T20:39:58.560 に答える