在OS X上丢失关键事件

时间:2015-02-09 11:09:14

标签: objective-c macos cocoa keyboard osx-yosemite

我正在为OS X编写类似游戏的应用程序,并且需要知道在游戏循环期间是否按下了左箭头和右箭头。我还检查空格键是否已关闭。为此,我实施

-(void)keyDown:(NSEvent *)event;
-(void)keyUp:(NSEvent *)event

在我看来并将每个键的状态存储在某些标志中。我还检查是否按下了命令按钮:

-(void)flagsChanged:(NSEvent *)event;

如果窗口不是主窗口(另一个窗口获得焦点)或者辞退键(聚光灯打开),我会重置标志。我这样做是通过实施:

-(void)windowDidBecomeKey:(NSNotification *)notification;
-(void)windowDidResignKey:(NSNotification *)notification;
-(void)windowDidResignMain:(NSNotification *)notification;
-(void)windowDidBecomeMain:(NSNotification *)notification;

这几乎一直都有效。如果我按下命令然后按空格键,聚焦灯会打开,我的应用程序会重新启动键。但是,如果我按住例如左箭头键,并且首先按住并保持空间,则命令,聚光灯不会显示,但是当我释放它时,我有时会丢失箭头键的键盘事件。它并不是每次都会发生,但(可能取决于发布顺序)但很容易在几次尝试中重现。所以钥匙一直停下来,直到下一次按下。

我的应用程序是否还有其他状态,我不知道?如果没有,这种方法似乎有点脆弱。

是否有更强大的方法来检查密钥是否已关闭(不需要安装记录器工具或在偏好设置中启用应用程序的辅助功能)?

1 个答案:

答案 0 :(得分:3)

为此,我使用NSEvent的{​​{1}} - 静态方法。它在应用程序处于活动状态时有效。使用addLocalMonitorForEventsMatchingMask:handler:处理全局事件,但请注意您的应用可能会被AppStore拒绝。这里有一些代码示例。

addGlobalMonitor...