macOS 按键事件慢速重复

Posted

技术标签:

【中文标题】macOS 按键事件慢速重复【英文标题】:macOS Key Event Slow Repeat 【发布时间】:2018-12-15 04:22:35 【问题描述】:

我正在尝试在 macOS 中创建一个小型 WASD 演示游戏。我使用NSEvent 来处理关键事件。为了检测按键,我正在搜索keyDown 事件。这是我所拥有的:

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) 
        (keyEvent) -> NSEvent? in
        if self.keyDown(with: keyEvent) 
            return nil
         else 
            return keyEvent
        
    

func keyDown(with event: NSEvent) -> Bool 

    userInt.keyDown(key: event.characters)

    return true

所以在这里,我按住键(正如您在游戏中所期望的那样),并且我的动作非常缓慢。就像,当我按住它时,它非常笨拙。经过进一步检查,我发现密钥重复间隔为 0.1 秒,这是在我的系统偏好设置中设置的。这意味着它正在跳帧。但是,在游戏中,我不希望此设置影响运动。那么如何在不被按键重复间隔阻止的情况下检测到按键持有事件

【问题讨论】:

【参考方案1】:

您应该忽略按键重复事件(isARepeat true)。相反,当您收到按键事件时,请启动一个计时器,该计时器会触发您想要提升游戏状态的频率。在该计时器的触发代码中推进游戏状态。当您收到按键事件时,停止计时器。

【讨论】:

我实际上已经想到了这种技术,但我认为会有一种更简单的方法,它不在 NSEvent 文档中。但如果这是唯一的方法,我会去的。谢谢。 不客气。当你这样做时,你可能应该根据事件的关键代码而不是字符来采取行动。例如,您想“向前移动”最上面一行字母中从左数第二个的键,不一定是产生“w”字符的键,它可能位于具有不同键盘布局的不同位置。无论键盘布局产生什么字母,该键都有keyCodekVK_ANSI_W

以上是关于macOS 按键事件慢速重复的主要内容,如果未能解决你的问题,请参考以下文章

响应 SwiftUI 中的按键事件

在按键事件中使用jQuery在textarea中设置文本[重复]

Jquery:如何根据属性值将按键事件绑定到输入类型“数字”[重复]

按键事件处理

在 Swift 中检测按键事件

MTK功能机按键事件时间设置