Objective c Cocoa全局热键使用键事件

Objective c Cocoa全局热键使用键事件,objective-c,cocoa,keyevent,macos-carbon,Objective C,Cocoa,Keyevent,Macos Carbon,我已经尝试了几个小时使用全局热键和“消费”键事件,这样就不会再将它转发到键事件最初来自的应用程序 所以我想做的是: -用户按下前面有应用程序a的快捷键,例如Cmd+F3 -我的应用程序(应用程序B)通过全局事件处理程序接收此快捷方式,并将鼠标和键盘事件发送给应用程序A 把它看作一个宏可能是最容易的 我用的是DDHotkey,它工作得很好。我的问题是DDHotkey不“使用”键事件和修饰符。这意味着,当我的应用程序开始发送鼠标和键盘事件时,实际全局快捷键中的Cmd键仍被按下 在我的例子中,这会导致

我已经尝试了几个小时使用全局热键和“消费”键事件,这样就不会再将它转发到键事件最初来自的应用程序

所以我想做的是: -用户按下前面有应用程序a的快捷键,例如Cmd+F3 -我的应用程序(应用程序B)通过全局事件处理程序接收此快捷方式,并将鼠标和键盘事件发送给应用程序A

把它看作一个宏可能是最容易的

我用的是DDHotkey,它工作得很好。我的问题是DDHotkey不“使用”键事件和修饰符。这意味着,当我的应用程序开始发送鼠标和键盘事件时,实际全局快捷键中的Cmd键仍被按下

在我的例子中,这会导致错误的行为(例如,我以编程方式双击一个文本字段,当按下Cmd时它不会打开)

因此,我想做的是真正使用键事件和修改键,这样它们就不会转发到应用程序A。或者,我会在将键事件发送到应用程序A之前“刷新”事件队列


有什么方法可以轻松实现这一点吗?

如果它适用于您的用例,则更可靠的方法可能是不通过触发鼠标事件和按键来编写UI脚本,而是使用可访问性API来触发更高级的操作(如使用可访问性来告知按钮已按下)。除非应用程序包含一些不幸的代码,否则不应该查看修改键

从事件监视器告诉操作系统删除密钥状态可能会引起很多问题:如果用户随后真的释放了物理密钥,并且出现了第二个密钥更新,这将令人困惑。即使操作系统试图避免这种情况,它也只是在询问其他边缘案例错误——如果用户在编写UI脚本时按下了修改器键会怎么样


但是,如果您正在编写脚本的应用程序不支持可访问性、AppleScript或任何其他更高级别的自动化方法,那么您可以等待用户释放热键(即等待keyUp事件),然后才触发您的脚本操作。可能需要使用performSelector:withObject:afterDelay:0.0,以便在执行此操作之前退出keyUp处理程序。

如果它适用于您的用例,则更可靠的方法可能是不通过触发鼠标事件和按键来编写UI脚本,而是使用可访问性API来触发更高级的操作(就像使用可访问性来告诉一个按钮它被按下了)。除非应用程序包含一些不幸的代码,否则不应该查看修改键

从事件监视器告诉操作系统删除按键状态可能会导致很多问题:如果用户随后实际释放了物理按键,并且出现了第二个按键,这会让人感到困惑。即使操作系统试图避免这种情况,这也只是问到其他边缘情况错误-如果用户在编写代码时按下了修改键怎么办g用户界面


但是,如果您正在编写脚本的应用程序不支持可访问性、AppleScript或任何其他更高级的自动化方法,那么您可以等待用户释放热键(即等待keyUp事件)然后才触发脚本操作。可能需要使用performSelector:withObject:afterDelay:0.0在执行此操作之前退出keyUp处理程序。

搜索“事件点击”。我使用了,并且我有使用CGEventTap的工作代码。问题仍然存在。无法“杀死”修饰符键。我能找到的唯一解决方法是将应用程序A放到前端,并为Cmd发送一个键向上事件。当使用CGEventPostToPSN()从应用程序B发送事件时,它不起作用,仅当应用程序A处于活动状态且CGEventPost(kCGHIDEventTap,theEvent)时才起作用已使用。您确定发送的事件没有修改器标志吗?您如何知道要使用哪些修改器键?您不知道热键是否将被按下。搜索“事件点击”。我使用了,并且我有使用CGEventTap的工作代码。问题仍然存在。无法“杀死”修饰符键。我能找到的唯一解决方法是将应用程序A放到前端,并为Cmd发送一个键向上事件。当使用CGEventPostToPSN()从应用程序B发送事件时,它不起作用,仅当应用程序A处于活动状态且CGEventPost(kCGHIDEventTap,theEvent)时才起作用已使用。是否确实发送的事件没有修改器标志?如何知道要使用哪些修改器键?不知道是否要按下热键。