监控进程内的键盘事件(Process Wide)

时间:2012-07-11 16:39:39

标签: c++ xcode macos cocoa macos-carbon

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

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 个答案:

答案 0 :(得分:4)

我想你想要NSEvent的{​​{1}}

addLocalMonitorForEventsMatchingMask:handler:

the docs。这不需要打开Universal Access。

答案 1 :(得分:2)

如果您不必监控其他进程,那么您应该可以使用普通事件来查看键盘。

在Carbon中,安装kEventRawKeyDown(例如)kEventClassKeyboard的处理程序,例如在应用程序或窗口级别。

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

答案 2 :(得分:2)

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

这是仅在当前流程中侦听事件的流程范围方式,而非系统范围。

答案 3 :(得分:1)

在Cocoa中,我认为你想要继承NSApplication并覆盖-[NSApplication sendEvent:]