【发布时间】:2015-04-09 02:35:06
【问题描述】:
我正在为 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;
这几乎一直有效。如果我按命令然后按空格键,聚光灯会打开并且我的应用程序退出键。但是,例如,如果我按住左箭头键,然后先按住空格键,然后命令、聚光灯不会出现,但是当我释放箭头键时,有时我会丢失箭头键的按键事件。它不会每次都发生,但(可能取决于发布顺序)但它很容易在几次尝试中重现。所以键被卡住直到下一次按下。
我的应用程序是否进入了我不知道的其他状态?如果不是,这种方法似乎有点脆弱。
是否有更可靠的方法来检查按键是否已按下(不需要安装记录器工具或在首选项中启用应用程序的可访问性)?
【问题讨论】:
标签: objective-c macos cocoa keyboard osx-yosemite