监视进程内的键盘事件(进程范围)
Monitor keyboard events inside process (Process Wide)
我可以按照以下说明安装系统范围的键盘监视器:
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);
}
此代码的缺点是,它需要在"系统首选项"中激活"通用访问",并监控所有进程(我不需要它)。
我想监视进程内的键盘事件。激活"通用访问"的可能性和必要性如何?谢谢。
我想你想要NSEvent
的addLocalMonitorForEventsMatchingMask:handler:
self.eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event) {
NSLog( @"keyDown event!" );
return event;
}];
请参阅文档。这不需要打开通用访问。
如果您不必监视其他进程,那么您应该能够使用正常事件查看键盘。
在Carbon中,为kEventClassKeyboard
的kEventRawKeyDown
(比如)安装一个处理程序,例如在应用程序或窗口级别。
在Cocoa中,在NSResponder
的子类上实现keyDown:
或任何您需要的方法,例如您的NSApplication
子类或特定的NSWindow
子类。
ProcessSerialNumber psn = { 0 };
GetCurrentProcess( & psn );
CGEventTapCreateForPSN( & psn, ... );
这是只在当前流程中而不是在系统范围内侦听事件的流程范围方式。
在Cocoa中,我认为您应该将NSApplication子类化并覆盖-[NSApplication sendEvent:]
。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- boost::进程间消息队列引发错误
- 尝试通过多个向量访问变量时,向量下标超出范围
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 错误:未在此范围内声明'reverse'
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- IPC使用多个管道和分支进程来运行Python程序
- 在基于范围的for循环中使用结构化绑定声明
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围
- 使用计时器块提升进程间范围的锁,尽管应该返回
- 关闭Qt控制台应用程序会终止exec()调用中的进程,并且无法从main()扩展到范围
- 监视进程内的键盘事件(进程范围)
- 将gcov与子进程和共享库一起使用时没有覆盖范围
- 为什么我不能在特定进程的范围内使用MPI_Scatter()