监视进程内的键盘事件(进程范围)

Monitor keyboard events inside process (Process Wide)

本文关键字:进程 范围 事件 键盘 监视      更新时间:2023-10-16

我可以按照以下说明安装系统范围的键盘监视器:

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);
}

此代码的缺点是,它需要在"系统首选项"中激活"通用访问",并监控所有进程(我不需要它)。

我想监视进程内的键盘事件。激活"通用访问"的可能性和必要性如何?谢谢。

我想你想要NSEventaddLocalMonitorForEventsMatchingMask:handler:

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

请参阅文档。这不需要打开通用访问。

如果您不必监视其他进程,那么您应该能够使用正常事件查看键盘。

在Carbon中,为kEventClassKeyboardkEventRawKeyDown(比如)安装一个处理程序,例如在应用程序或窗口级别。

在Cocoa中,在NSResponder的子类上实现keyDown:或任何您需要的方法,例如您的NSApplication子类或特定的NSWindow子类。

ProcessSerialNumber psn = { 0 };
GetCurrentProcess( & psn );
CGEventTapCreateForPSN( & psn, ... );

这是只在当前流程中而不是在系统范围内侦听事件的流程范围方式。

在Cocoa中,我认为您应该将NSApplication子类化并覆盖-[NSApplication sendEvent:]