当 Mission Control 运行时,它会阻止应用程序接收键盘和鼠标事件。它还使最后一个运行的应用程序认为它仍然具有焦点。这对我来说是个问题,因为如果我用鼠标按钮或按住的键启动任务控制,我不会收到 keyUp 或 mouseUp 事件,并且我的应用程序的行为就像按住鼠标按钮或键一样。
我想要一种即使在任务控制处于活动状态时也能读取键盘和鼠标事件的方法,或者一种检测任务控制处于活动状态的方法。理想情况下,我希望能够执行后者,因为在 Mission Control 运行时我实际上无法使用我的应用程序。
我尝试了几件事没有运气:
- 使用 addGlobalMonitorForEventsMatchingMask 为键盘和鼠标事件注册一个全局监视器。当我切换到另一个应用程序时,这会捕获鼠标事件(但不是键盘事件,尽管文档说 keyDown 事件应该被发送到全局监视器),但是 Mission Control 似乎并没有让事件传播到全局监视器。
- 检查
[[NSRunningApplication currentApplication] {isActive, ownsMenuBar}]
。显然,我的应用程序处于活动状态,即使它没有收到事件! - 检查
[NSApp keyWindow] != nil
。显然,我的一个窗口应该正在接收关键事件。他们都不是。 - 检查 Mission Control 是否是
[NSWorkspace runningApplications]
. Mission Control 在运行时不会显示在此列表中。
编辑:
我终于解决了这个问题(尽管不是很满意)。对于鼠标,事实证明您可以使用 查询按下按钮的状态[NSEvent pressedMouseButtons]
。我只是从 NSLeftMouseDown 和 NSLeftMouseUp 事件中跟踪我认为鼠标状态应该是什么,并将其与[NSEvent pressedMouseButtons]
每隔一段时间进行比较以确保它们是一致的。如果不是,那么我知道某些东西劫持了我的 NSLeftMouseUp 事件并采取相应措施。
对于键盘,我找不到查询键盘状态的方法,所以我无法做类似的解决方法。我最终在按下按键时使用演示选项禁用了应用程序切换。