Cocoa全局热键消耗关键事件

时间:2016-11-21 00:14:42

标签: objective-c cocoa keyevent macos-carbon

我一直在努力使用全球热键并且"消费"关键事件,因此它不再被转发到最初来自关键事件的应用程序。

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

将它视为宏观可能最容易。

我使用DDHotkey并且它工作得很好。我遇到的问题是DDHotkey没有消费"关键事件和修饰语。这意味着当我的应用程序开始发送鼠标和键盘事件时,仍会按下来自实际全局快捷方式的Cmd键。

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

所以我想要做的就是消耗关键事件和修饰键,这样它们就不会转发给应用程序A.或者,我会" flush"在将关键事件发送到应用程序A之前的事件队列。

有没有办法轻松实现这一目标?

1 个答案:

答案 0 :(得分:0)

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

从事件监视器中删除操作系统以删除关键状态可能会导致很多问题:如果用户然后实际释放了物理密钥并且第二个keyUp进来,那将会很困惑。即使操作系统试图避免这种情况,它只是要求其他边缘案例错误 - 如果用户在您的代码编写UI脚本时按下修饰键会怎么样?

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