我正在使用CGEventTapCreateForPSN
为我的应用程序捕获和过滤密钥。我对拦截其他应用程序的事件不感兴趣。我很确定事件点击对于我的目的来说太重了,但我一直无法找到更好的方法,并且使用事件点击有效。
具体来说,这段代码做了我想要的。
GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
而且我的回调处理得很好,事件仅从当前应用程序中截获。
不幸的是,从 10.9 开始,所有获取电流的方法ProcessSerialNumber
都已被弃用。有一种旧的标准方法可以ProcessSerialNumber
在同一进程中传递给其他例程,通过这个初始化......
ProcessSerialNumber psn = { 0, kCurrentProcess };
但这在调用时不起作用CGEventTapCreateForPSN
。头文件 docs 表明了这一点,以下代码片段NULL
作为确认返回。
ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
我可以使用CGEventTapCreate
,但它会点击整个主机,然后我需要过滤任何未定向到我的应用程序的东西,而且它CGEventTapProxy
是不透明的,我不知道如何使用它来确定它是否是我的应用程序。
我已经验证过不推荐使用的代码仍然有效,但 Apple 可以随时决定将其删除。那么,有没有人知道我应该如何继续调用CGEventTapCreateForPSN
小牛队及其他球队?
谢谢!
更新
在 10.11(我认为那是 El Capitan)中,添加了一个新功能。虽然它的文档为零,但它的签名几乎与CGEventTapCreateForPSN
.
CFMachPortRef CGEventTapCreateForPSN(
void *processSerialNumber,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
CFMachPortRef CGEventTapCreateForPid(
pid_t pid,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
因此,不需要弃用的函数,因为 PID 可以用作第一个参数。