我正在为Mac OSX开发一个打字导师应用程序,即使应用程序没有被关注,也需要将键击转发给它.
有没有办法让系统向应用程序转发击键,可能是通过NSDistributedNotificationCenter?我用谷歌搜索了自己,并且找不到答案......
编辑: 下面的示例代码.
感谢@NSGod指出我正确的方向 - 我最终使用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);
}];
Run Code Online (Sandbox Code Playgroud)
对我来说,棘手的部分是使用块,所以我会给出一些描述,以防它帮助任何人:
关于上面代码的注意事项是它是NSEvent上的所有单个方法调用.该块作为参数直接提供给函数.你可以认为它有点像内联委托方法.仅仅因为这需要一段时间才能让我沉沦,我将在这里一步一步地完成它:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
Run Code Online (Sandbox Code Playgroud)
这第一位没问题.您在NSEvent上调用类方法,并告诉它您要监视哪个事件,在本例中为NSKeyDownMask.一个支持的事件类型的面罩的名单,可以发现在这里.
现在,我们来到棘手的部分:处理程序,它需要一个块:
handler:^(NSEvent *event){
Run Code Online (Sandbox Code Playgroud)
我花了一些编译错误才能做到这一点,但是(谢谢Apple)他们是非常有建设性的错误信息.首先要注意的是克拉^.这标志着块的开始.在那之后,在括号内,
NSEvent *event
Run Code Online (Sandbox Code Playgroud)
其中声明了您将在块中使用的变量来捕获事件.你可以打电话给它
NSEvent *someCustomNameForAnEvent
Run Code Online (Sandbox Code Playgroud)
没关系,你只是在块内使用该名称.然后,这就是它的全部内容.确保关闭大括号和括号以完成方法调用:
}];
Run Code Online (Sandbox Code Playgroud)
而且你已经完成了!这真的是一种"单线".在您的应用程序中执行此调用的位置无关紧要 - 我在AppDelegate的applicationDidFinishLaunching方法中执行此操作.然后,在块中,您可以从应用程序中调用其他方法.
我正在开发一个音乐相关的网站,经常使用HTML特殊字符锐利(♯)和平面(♭)来保持漂亮,例如:
♯
♭
Run Code Online (Sandbox Code Playgroud)
但是,我注意到在某些浏览器(IE6,Safari for PC)中,这些字符不受支持.我已经创建了一个条件javascript,它提供普通的,支持的字符来代替特殊的字符(G#为G♯而Bb为B♭).但我很难弄清楚如何检测哪些浏览器缺少这些字符.
我知道我可以测试浏览器(例如ie6),但我希望做正确的事情并测试角色支持本身.
有没有人知道使用javascript,jQuery或rails执行此操作的好方法?(该页面由rails应用程序提供,因此请求对象和任何其他Rails魔法都在桌面上.