好吧,Cocoa 事件方法和 Quartz 事件点击已经过时了,因为它们要么需要 root 访问权限,要么需要可访问权限,或者不会在 Dock 之前捕获事件。
碳的PushSymbolicHotKeyMode
已退出,因为根据文档,它需要可访问性访问。
碳的RegisterEventHotKey
可能是因为苹果似乎不允许它(请参阅我对问题的评论中的链接)。然而,即便如此,我测试过,你不能用它来捕获 Command+Tab。
我快速证明了这一点can工作,但是 YMMV:
- 实施
KeyboardWatcher
来自此的示例类answer https://stackoverflow.com/a/39834889/233944。您需要链接 IOKit。
- 添加硬件 - USB (com.apple.security.device.usb) 沙箱权利。这是必要的,因为 KeyboardWatcher 使用 HID 来捕获按键操作
- the
Handle_DeviceEventCallback
会给你按下的键。显然你可以根据你的需要修改它
- Use
SetSystemUIMode
阻止任务切换器和 Spotlight。您需要链接 Carbon。
SetSystemUIMode(kUIModeContentSuppressed, kUIOptionDisableProcessSwitch);
请注意,这仅在您的应用程序位于前台时有效(可能是您想要的)。我使用跟踪矩形在我的视图上设置了此选项,因此只有当鼠标位于我的视图上时它才会生效(就像在 Remotix 中一样):
- (void)viewDidLoad {
[super viewDidLoad];
NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self.view bounds] options: (NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways) owner:self userInfo:nil];
[self.view addTrackingArea:trackingArea];
}
- (void) mouseEntered:(NSEvent*)theEvent {
SetSystemUIMode(kUIModeContentSuppressed, kUIOptionDisableProcessSwitch);
}
- (void) mouseExited:(NSEvent*)theEvent {
SetSystemUIMode(kUIModeNormal, 0);
}
Remotix 似乎链接了 Carbon 和 IOKit,但我看不到它们是否有 USB 授权(我尝试了演示,而不是 App Store 版本)。他们有可能正在做这样的事情。
实现此目的的正常方法是安装 Quartz 事件分接头。但是,要接收针对其他应用程序的事件,您需要(如您所说)成为 root 用户,或者为您的应用程序启用辅助功能访问权限。
在当前的沙箱规则中似乎不可能使用事件点击。这在开发者论坛 https://devforums.apple.com/message/742845#742845。该链接仅供登录,但引用线程:
是否有机会通过阻止启动 iTunes 来处理来自媒体键的事件。在沙箱之前,可以通过创建 CGEvent Tap 来实现,但不能使用 hid-controll 来拒绝沙箱。
不,目前在应用程序沙箱中不可能实现这一点。
我不确定还有其他方法可以做到这一点;我有兴趣知道 App Store 中的哪些应用程序可以?
VMWare Fusion 显然没有沙盒化,苹果自己的应用程序不受这些规则的约束。请记住,沙盒仅对 2012 年推出后添加的新应用程序强制执行。该日期之前添加的应用程序不会强制执行沙盒。看到这个answer https://stackoverflow.com/a/32248238/233944.