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

我想你想要NSEventaddLocalMonitorForEventsMatchingMask: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 回答