【问题标题】:Losing key-up event on OS X在 OS X 上丢失按键事件
【发布时间】: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


    【解决方案1】:

    为此,我使用NSEventaddLocalMonitorForEventsMatchingMask:handler:-static 方法。它在应用程序处于活动状态时工作。使用addGlobalMonitor... 处理全局事件,但请注意您的应用可能会被 AppStore 拒绝。这里有一些代码示例。

    id monitor=[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:(NSEvent *)^(NSEvent *theEvent){
        if (theEvent.keyCode==/*your key code*/) // you should check the key modifiers too
        {
          // your code here
        }
        return theEvent; // you may return the event to pass the key to the receiver or nil if no need
      }];
    // remove monitor
    [NSEvent removeMonitor:monitor];
    

    【讨论】:

    • 感谢出色的解决方案。似乎像魅力一样工作。明确一点:addLocalMonitorForEventsMatchingMask 不会导致拒绝,对吧?
    • @rasmus 不确定。
    猜你喜欢
    • 2011-01-23
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多