【发布时间】:2012-09-22 21:20:55
【问题描述】:
当 Mission Control 运行时,它会阻止应用程序接收键盘和鼠标事件。它还使最后一个运行的应用程序认为它仍然具有焦点。这对我来说是个问题,因为如果我用鼠标按钮或按住的键启动任务控制,我不会收到 keyUp 或 mouseUp 事件,并且我的应用程序的行为就像按住鼠标按钮或键一样。
我想要一种即使在任务控制处于活动状态时也能读取键盘和鼠标事件的方法,或者一种检测任务控制处于活动状态的方法。理想情况下,我希望能够执行后者,因为在 Mission Control 运行时我实际上无法使用我的应用程序。
我尝试了一些没有运气的事情:
- 使用 addGlobalMonitorForEventsMatchingMask 为键盘和鼠标事件注册一个全局监视器。当我切换到另一个应用程序时,这会捕获鼠标事件(但不是键盘事件,尽管documentation 说 keyDown 事件应该发送到全局监视器),但是 Mission Control 似乎并没有让事件传播到全局监视器。李>
- 检查
[[NSRunningApplication currentApplication] {isActive, ownsMenuBar}]。 显然,我的应用程序处于活动状态,即使它没有收到事件! - 检查
[NSApp keyWindow] != nil。 显然,我的一个窗口应该正在接收关键事件。它们都不是。 - 检查 Mission Control 是否是
[NSWorkspace runningApplications]返回的正在运行的应用程序之一。 Mission Control 在运行时不会显示在此列表中。
编辑:
我终于解决了这个问题(尽管不是很令人满意)。对于鼠标,原来可以用[NSEvent pressedMouseButtons]查询按下按钮的状态。我只是跟踪我认为鼠标状态应该来自 NSLeftMouseDown 和 NSLeftMouseUp 事件,并经常将其与[NSEvent pressedMouseButtons] 进行比较以确保它们是一致的。如果不是,那么我知道某些东西劫持了我的 NSLeftMouseUp 事件并采取相应措施。
对于键盘,我找不到查询键盘状态的方法,所以我无法做类似的解决方法。当按键被按下时,我最终使用presentation options 禁用了应用程序切换。
【问题讨论】:
-
来自文档:“只有在启用了可访问性或您的应用程序受信任以进行可访问性访问时,才能监控与密钥相关的事件(请参阅 AXIsProcessTrusted)。” – 这可能就是您没有收到关键事件的原因。在系统的可访问性首选项中启用“辅助设备访问”,看看是否有任何改变。
-
你说得对,启用可访问性确实给了我全局关键事件,但不是在任务控制处于活动状态时。
-
我建议您提交错误报告:developer.apple.com/bugreporter -另外,最好让支持者想出解决方案,而不是要求特定的东西。也就是说,错误报告应该只清楚简洁地确定问题。
-
谢谢,我已经向 Apple 提交了错误报告。如果我从他们那里得到解决方案,我会报告。
-
另请参阅这个非常相关的问题:stackoverflow.com/questions/9352939/…
标签: objective-c macos cocoa