我可以按照以下说明安装系统范围的键盘显示器:
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);
}
此代码的缺点是它需要在“系统偏好设置”中激活“通用访问”,并且还要监视所有进程(我不需要它)。
我想监控我的流程中的键盘事件 。如何可能,是否需要激活“通用访问”?三江源。
答案 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:]
。