我正在为 Mac OS X 开发一个打字辅导应用程序,即使该应用程序未处于焦点状态,也需要将击键转发给它。
有没有办法让系统将击键转发到应用程序(可能通过 NSDistributedNotificationCenter)?我用谷歌搜索了自己愚蠢的,但没能找到答案......
EDIT: 下面的示例代码.
感谢@NSGod 为我指明了正确的方向——我最终添加了一个全局事件监视器 https://developer.apple.com/documentation/appkit/nsevent/1535472-addglobalmonitorforeventsmatchin使用该方法addGlobalMonitorForEventsMatchingMask:handler:
,效果很好。为了完整起见,我的实现如下所示:
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
对我来说,棘手的部分是使用块,所以我会给出一些描述,以防它对任何人有帮助:
上面的代码需要注意的是,它都是一次方法调用在 NSEvent 上。该块直接作为参数提供to功能。您可以将其视为内联委托方法。因为这需要我一段时间才能理解,所以我将在这里一步一步地完成它:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
这第一点没有问题。您正在调用 NSEvent 上的类方法,并告诉它您要监视哪个事件,在本例中为 NSKeyDownMask。 A支持的事件类型的掩码列表 http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:可以被找寻到here http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:.
现在,我们来到棘手的部分:处理程序,它需要一个块:
handler:^(NSEvent *event){
我遇到了一些编译错误才得到这个正确的结果,但是(谢谢苹果)它们是非常有建设性的错误消息。首先要注意的是克拉^。这标志着区块的开始。之后,在括号内,
NSEvent *event
它声明了您将在块中使用的变量来捕获事件。你可以称之为
NSEvent *someCustomNameForAnEvent
没关系,您只需在块中使用该名称即可。那么,这就是全部内容了。确保关闭大括号和方括号以完成方法调用:
}];
你就完成了!这确实是一种“单行”。在应用程序中的何处执行此调用并不重要 - 我在 AppDelegate 的 applicationDidFinishLaunching 方法中执行此操作。然后,在该块内,您可以从应用程序内调用其他方法。