macos - Cocoa 中 GetKeys() 的现代等价物是什么?

标签 macos cocoa keyboard

我希望读取 Cocoa 中键盘的状态(对于我在 SpriteKit 中构建的游戏)。

NSResponder 肯定会给我按键操作,但我没有收到修饰键按下的事件,如果我按住一个键,然后按另一个键,我将停止收到第一个键的 keyDown 事件。

在古代(在我的 MacPlus 上),我使用 GetKeys() 来获取每帧顶部的键盘状态。 我感到惊讶和困惑,这个仍然似乎有效:

KeyMap keys; 
GetKeys(keys); 
UInt32 keys3 = CFSwapIn32BigToHost(keys[3].bigEndianValue); 
if (keys3 & 4) 
{ 
    NSLog(@"F1 is down"); 
}

但是,我确信一定存在本地化、不同键盘或其他问题(使用 30 年前的工具箱调用让我犹豫)。

有与此功能等效的现代版本吗?

最佳答案

有几种方法可以做到这一点,主要围绕 NSEvent API。

  1. 您可以向 NSApplication 实例询问 currentEvent。这将为您提供一个 NSEvent,您可以检查其 characterscharactersIgnoringModifiersmodifierFlags 等。
  2. 如果您只对修饰键感兴趣,则只需请求 +[NSEvent modifierFlags] 即可返回当前按下的修饰键的位掩码。
  3. 您可以安装事件监视器(全局或本地),以便在按键和/或修饰键发生更改时发出通知。

最后一种方法可能是最好的方法,因为它不需要轮询。

关于macos - Cocoa 中 GetKeys() 的现代等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214899/

相关文章:

cocoa - 如何在 NSUserDefaults 中表示 “none” 值?

objective-c - Cocoa 设置终端退出代码变量

macos - 在 Mac 应用程序沙箱内使用 LaunchAgent

c++ - SDL 2.0 中的垃圾键盘信息

ios - 如何检测 iPad 上的智能/外接键盘?

c++ - 3D vector 索引不一致 C++

macos - 不支持的配置 : Initial position of this window is outside of this machine's screen

objective-c - 是否可以在不使用属性的情况下创建原子局部变量?

Javascript禁用空格键以更改密码文本框

swift - 模拟程序的初始运行(即没有 NSUserDefaults 文件)