2012-07-11 25 views
0

我可以通过下面的说明安装系统范围内的键盘显示器内部流程监控键盘事件:(过程广角)

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

我想你想NSEventaddLocalMonitorForEventsMatchingMask:handler:

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

the docs。这并不需要启用Universal Access。

+0

如果我没有访问“自我”,会发生什么?我已经写了一个注入到其他进程中的dylib,在InDesign这样的碳应用程序中,我使用Carbon Events并且没有问题,但是在像TextEdit这样的可可应用程序中,如何在dylib中使用您的方法? – 2012-07-22 10:36:10

+0

addLocalMonitorForEventsMatchingMask:处理程序:返回一个ID,您需要将它保存在某处,以便稍后可以删除监视器(使用removeMonitor :)。在我的例子中,我将它作为一个类的一个属性,但它不一定是。 – zpasternack 2012-07-22 18:47:16

2

如果您不必监视其他进程,那么您应该可以使用普通事件来查看键盘。在Carbon中,安装kEventRawKeyDown(比如说)kEventClassKeyboard的处理程序,例如

。在应用程序或窗口级别。

在可可,实现keyDown:或者您需要对NSResponder一个子类,如您NSApplication子类或特定NSWindow子类任何方法。

+0

如果我没有访问NSApplication会发生什么?我已经写了一个注入其他进程的dylib,在InDesign这样的碳应用程序中,我使用Carbon Events并且没有问题,但是在像TextEdit这样的可可应用程序中,我如何实现keyDown:在dylib中? – 2012-07-22 10:34:35

1

在可可,我想你想要NSApplication的子类并重写-[NSApplication sendEvent:]

+0

如果我没有访问“NSApplication”会怎么样?我已经写了一个注入其他进程的dylib,在InDesign这样的碳应用程序中,我使用Carbon Events并且没有问题,但是在像TextEdit这样的可可应用程序中,如何监控dylib中的keydown? – 2012-07-22 10:39:40

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

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

+0

我还没有测试过,但它似乎是一个非常好的答案。谢谢。 – 2013-03-13 06:27:39