0

以下の手順でシステムワイドキーボードモニターをインストールできます。

CGEventRef eventCallback(CGEventTapProxy proxy, CGEventType type,
    CGEventRef event, void *userData)
{
}

CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap,
    kCGHeadInsertEventTap, kCGEventTapOptionDefault,
    kCGEventKeyDown,
    &eventCallback,
    NULL);
if(eventTap)
{
    CFRunLoopSourceRef eventRunLoopSourceRef =
        CFMachPortCreateRunLoopSource(NULL, eventTap, 0);
    CFRelease(eventTap);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), eventRunLoopSourceRef,
        kCFRunLoopDefaultMode);
    CFRelease(eventRunLoopSourceRef);
}

このコードの欠点は、「システム環境設定」で「ユニバーサルアクセス」をアクティブにし、すべてのプロセスを監視する必要があることです(私はそれを必要としません)。

プロセス内のキーボードイベントを監視したい。どのようにして「ユニバーサルアクセス」を有効にする必要がありますか?ありがとうございました。

4

4 に答える 4

4

私はあなたが欲しいと思いNSEventますaddLocalMonitorForEventsMatchingMask:handler:

self.eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask 
    handler:^(NSEvent *event) {
        NSLog( @"keyDown event!" );
        return event;
    }];

ドキュメントを参照してください。これには、ユニバーサルアクセスをオンにする必要はありません。

于 2012-07-22T09:17:21.573 に答える
2

他のプロセスを監視する必要がない場合は、通常のイベントを使用してキーボードを確認できるはずです。

Carbonでは、たとえばアプリケーションレベルまたはウィンドウレベルで、kEventRawKeyDownの(たとえば)のハンドラーをインストールします。kEventClassKeyboard

Cocoaで、サブクラスや特定のサブクラスなどkeyDown:のサブクラスに必要なメソッドを実装します。NSResponderNSApplicationNSWindow

于 2012-07-22T03:23:34.360 に答える
2
ProcessSerialNumber psn = { 0 };
GetCurrentProcess( & psn );
CGEventTapCreateForPSN( & psn, ... );

これは、システム全体ではなく、現在のプロセスでのみイベントをリッスンするためのプロセス全体の方法です。

于 2013-03-11T17:50:55.380 に答える
1

Cocoaでは、NSApplicationをサブクラス化してオーバーライドしたいと思います-[NSApplication sendEvent:]

于 2012-07-22T04:31:47.420 に答える