事件点击:CGEventPost、kCGSessionEventTap、kCGAnnotatedSessionEventTap、CGEventTapPostEvent 的不同结果

StackOverflow https://stackoverflow.com/questions/553284

我在从事件点击发布事件时遇到了棘手的问题。我正在 kCGHIDEventTap 中点击 NSSystemDefined,然后用新事件替换该事件。我遇到的问题是,根据我发布事件的方式,它只能被某些应用程序看到。我的测试应用程序是 Opera、Firefox、Quicksilver 和 Xcode。以下是我在事件点击回调中尝试过的不同技术及其结果。我期待每个应用程序执行一个操作(“正确响应”);“系统蜂鸣声”是指与该键无关的系统声音。

  1. 创建一个新事件,并从回调中返回它。歌剧:无响应/系统蜂鸣声,Firefox:无响应/系统蜂鸣声,Quicksilver:正确的响应,Xcode:无响应/系统发出蜂鸣声

  2. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,返回 null。歌剧:无响应/系统蜂鸣声,Firefox:无响应/系统蜂鸣声,Quicksilver:正确的响应,Xcode:无响应/系统发出蜂鸣声

  3. 创建一个新事件,使用 CGEventPost 发布到 kCGAnnotatedSessionEventTap,返回 null。歌剧:正确响应,火狐:正确答案,快银:无响应/系统蜂鸣声,Xcode:无响应/系统发出蜂鸣声

  4. 创建一个新事件,使用 CGEventTapPostEvent 发布,返回 null。歌剧:无响应/系统蜂鸣声,Firefox:无响应/系统蜂鸣声,Quicksilver:正确的响应,Xcode:无响应/系统发出蜂鸣声

  5. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,并返回新事件。歌剧:无响应/系统蜂鸣声,Firefox:无响应/系统蜂鸣声,Quicksilver:正确的响应,Xcode:无响应/系统发出蜂鸣声

  6. 创建一个新事件,使用 CGEventPost 发布到 kCGAnnotatedSessionEventTap,并返回新事件。歌剧:正确响应和系统蜂鸣声,Firefox:正确响应和系统蜂鸣声,Quicksilver:正确响应和系统蜂鸣声,Xcode:无响应/双系统蜂鸣声

  7. 创建一个新事件,使用 CGEventTapPostEvent 发布,并返回新事件。歌剧:无响应/系统蜂鸣声,Firefox:无响应/系统蜂鸣声,Quicksilver:正确的响应,Xcode:无响应/系统发出蜂鸣声

(6) 是最好的,但用户抱怨正确答案时会发出额外的系统蜂鸣声,我猜这是由于该事件的重复发布所致。我不确定是否可以尝试其他组合,或者可以去哪里寻找。有人可以提供任何指导吗?有没有办法获得从我的回调返回事件并发布到带注释的水龙头的结果,而不需要同时执行这两者?

抱歉问了这么长的问题;我已经做了很多实验。

提前致谢


更新:这是我用来创建事件点击的代码:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
有帮助吗?

解决方案

我想我解决了这个问题。我一直在使用 +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] 创建一个 NSEvent,然后返回该事件的 -CGEvent. 。我切换到 CGEventCreateKeyboardEvent, ,使用从原始事件创建的事件源 CGEventCreateSourceFromEvent, ,并从回调中返回事件。我所有的测试现在都通过了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top