我正在开发一个 MacOS 菜单栏应用程序,它需要跟踪一些全局快捷方式,以便于调整外部显示器上的显示亮度。但是,我无法让它在任何键盘相关事件上触发处理程序(鼠标事件工作得很好)。
我正在使用以下代码检查可访问性
NSDictionary *options = @{CFBridgingRelease(kAXTrustedCheckOptionPrompt): @YES};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);
然后,我使用以下方法添加全局事件监视器:
self.eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^(NSEvent * event) {
NSLog(@"Some event");
}];
如果我切换NSEventMaskKeyDown
to NSEventMaskMouseMove
或其他与鼠标相关的东西,一切正常。如果我尝试NSEventMaskAny
,没有任何东西再次触发(这看起来很奇怪,因为它应该仍然在鼠标上触发)。
事实是NSEventMaskMouseMove
有效但是NSEventMaskKeyDown
没有明确表明您的应用程序当前does not满足跟踪关键事件所需的所有要求。NSEventMaskMouseMove
不被视为需要特殊安全保护的事件,甚至在以下情况下起作用AXIsProcessTrustedWithOptions
回报false
.
如所述,关键事件需要更多权限查尔斯·斯斯特卡 in 这个答案:
这不起作用的原因是因为全局监视器 .keyDown
事件比其他一些事件处理程序需要更多的权限,
包括有人认为这是重复的那个。这
主要是因为全局.keyDown监视器可用于恶意
目的,例如键盘记录器。所以有额外的安全保障
采取措施确保我们的合法性:
1) 您的应用程序需要进行代码签名。
2) 您的应用程序不需要启用应用程序沙箱,并且:
3)您的应用程序需要在安全和隐私中注册
首选项窗格中的“辅助功能”下。
您需要在应用程序目标的“常规”窗格中启用代码签名。确保“团队”和“签名证书”均已设置:
您还必须在“功能”窗格中禁用“应用程序沙箱”:
请注意,为了满足第三个要求,您还需要将 Xcode 本身添加到“辅助功能”窗格中。否则您希望能够调试您的事件监控。
关于关键事件的另外两个提示:
- 全局监控仅报告其他应用程序中发生的事件。要监视您自己的应用程序中的事件,您需要使用addLocalMonitorForEventsMatchingMask或来自的实现Cocoa 事件处理指南.
- 发送到安全文本字段的关键事件被屏蔽,如所述Jeff in 这个答案:
关键事件发送至NSSecureTextField
(or NSSecureTextFieldCell
) 被屏蔽,以便事件监视器无法拦截或读取它们。这是一项安全功能,可防止应用程序在输入密码时窃取密码,并且没有 API 可以绕过它。
关于与 AppStore 兼容的全局快捷方式的说明:很明显,您无法将沙箱禁用的应用程序上传到应用程序商店。如果您计划通过 Mac App Store (MAC) 分发应用程序,则必须使用不同的 API。这个线程提到了一系列对 MAS 友好的解决方案。他们使用RegisterEventHotKey
旧 APICarbon天。苹果promised to not拒绝使用它的应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)