5

从事件水龙头发布事件时,我遇到了一个棘手的问题。我在 kCGHIDEventTap 上点击 NSSystemDefined,然后用一个新事件替换该事件。我遇到的问题是,根据我发布事件的方式,它只能被某些应用程序看到。我的测试应用程序是 Opera、Firefox、Quicksilver 和 Xcode。以下是我在事件点击回调中尝试的不同技术以及结果。我期待每个应用程序采取行动(“正确响应”);“系统哔”表示没有任何东西绑定到那个键的系统声音。

  1. 创建一个新事件,并从回调中返回它。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  2. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,返回 null。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  3. 创建一个新事件,使用 CGEventPost 发布到 kCGAnnotatedSessionEventTap,返回 null。Opera:正确响应,Firefox:正确响应,Quicksilver:无响应/系统哔声,Xcode:无响应/系统哔声

  4. 创建一个新事件,使用 CGEventTapPostEvent 发布,返回 null。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  5. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,并返回新事件。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

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

  7. 创建一个新事件,使用 CGEventTapPostEvent 发布,并返回新事件。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

(6) 是最好的,但用户抱怨正确响应时额外的系统蜂鸣声,我猜这是来自事件的双重发布。我不确定其他组合可以尝试,或者在哪里寻找。任何人都可以提供任何指导吗?有没有什么方法可以同时从我的回调中返回事件并发布到带注释的水龙头而不做两者?

很抱歉这个冗长的问题;我一直在做很多实验。

提前致谢


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

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
4

1 回答 1

5

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

于 2010-04-12T22:06:50.047 回答