Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 监视进程内的键盘事件(进程范围)_C++_Xcode_Macos_Cocoa_Macos Carbon - Fatal编程技术网

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应用程序中,我如何监控动态库中的按键?我还没有测试过,但这似乎是一个非常好的答案。谢谢。