C++ 监视进程内的键盘事件(进程范围)
我可以按照以下说明安装系统范围的键盘监视器:C++ 监视进程内的键盘事件(进程范围),c++,xcode,macos,cocoa,macos-carbon,C++,Xcode,Macos,Cocoa,Macos Carbon,我可以按照以下说明安装系统范围的键盘监视器: CGEventRef eventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *userData) { } CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCG
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);
}
此代码的缺点是,它需要在“系统首选项”中激活“通用访问”,并监视所有进程(我不需要它)
我想监控进程中的键盘事件。激活“普遍接入”的可能性和必要性如何?谢谢。如果您不必监视其他进程,那么您应该能够使用正常事件查看键盘 在Carbon中,为
KeventCrawKeyDown
(例如)的kEventClassKeyboard
安装一个处理程序,例如在应用程序或窗口级别
在Cocoa中,实现
keyDown:
或对NSResponder
的子类所需的任何方法,例如您的NSApplication
子类或特定的NSWindow
子类。在Cocoa中,我认为您希望对NSApplication进行子类化并覆盖-[NSApplication sendEvent:]
我想您需要NSEvent
的添加LocalMonitorForeventsMatchingMask:handler:
self.eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event) {
NSLog( @"keyDown event!" );
return event;
}];
看。这不需要打开通用访问
ProcessSerialNumber psn = { 0 };
GetCurrentProcess( & psn );
CGEventTapCreateForPSN( & psn, ... );
这是进程范围的方式,仅用于侦听当前进程中的事件,而不是系统范围内的事件。如果我无法访问NSApplication,会发生什么?我已经编写了一个动态库,注入到其他进程中,在InDesign等碳应用程序中,我使用碳事件,没有问题,但在TextEdit等cocoa应用程序中,我如何实现keyDown:在动态库中?如果我无法访问“self”,会发生什么?我已经编写了一个动态库,注入到其他进程中,在InDesign等carbon应用程序中,我使用carbon事件,没有问题,但在TextEdit等cocoa应用程序中,我如何在动态库中使用您的方法?addLocalMonitorForEventsMatchingMask:handler:返回一个id,您需要将其保存在某个位置,以便以后删除监视器(使用removeMonitor:)。在我的示例中,我将其设置为类的属性,但不必设置为。如果我无权访问“NSApplication”,会发生什么情况?我已经编写了一个动态库,它被注入到其他流程中,在InDesign等碳应用程序中,我使用碳事件,没有问题,但在TextEdit等cocoa应用程序中,我如何监控动态库中的按键?我还没有测试过,但这似乎是一个非常好的答案。谢谢。