监视键盘事件的内部进程(process宽)(Monitor keyboard events insi

2019-09-19 08:22发布

我可以通过下面的说明安装系统范围内的键盘显示器:

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

这段代码的缺点是,它需要激活“普遍可及”,在“系统偏好设置”,并监视所有进程(我并不需要它)。

我想监视我的过程中键盘事件。 怎么可能,并激活“普遍可及”需要它? 谢谢。

Answer 1:

我想你想NSEventaddLocalMonitorForEventsMatchingMask:handler:

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

请参阅该文档 。 这并不需要普及被打开。



Answer 2:

如果你没有监测其他进程,那么你应该能够使用正常的事件看键盘。

碳,安装一个处理程序kEventRawKeyDown (比如说) kEventClassKeyboard ,例如在应用程序或窗口的水平。

在可可,实施keyDown:或任何你需要上的一个子类NSResponder ,如您NSApplication的子类或特定NSWindow的子类。



Answer 3:

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

这是仅适用于当前的进程,而不是整个系统的监听事件的过程中,广泛的方式。



Answer 4:

在可可,我想你会想继承的NSApplication并重写-[NSApplication sendEvent:]



文章来源: Monitor keyboard events inside process (Process Wide)