SDL 物理键码和 SDL 虚拟键码有啥区别?

Posted

技术标签:

【中文标题】SDL 物理键码和 SDL 虚拟键码有啥区别?【英文标题】:What is the difference between an SDL physical key code and an SDL virtual key code?SDL 物理键码和 SDL 虚拟键码有什么区别? 【发布时间】:2015-11-03 15:49:42 【问题描述】:

结构SDL_KeysymSDL_ScancodeSDL_Keycode 成员。它们之间有什么区别?该文档并没有真正为我清除它。我都试过了,他们似乎做同样的事情。

【问题讨论】:

【参考方案1】:

见the SDL documentation。 Scancodes 代表按键的物理位置,仿照标准 QWERTY 键盘,而 Keycodes 是按键获得的字符。

在 AZERTY 键盘上,按 A 将发出'Q' 扫描码和'a' 键码。

【讨论】:

我在谈论传统的扫描码,似乎 SDL 使用该术语来表示其他含义。所以是的,你的一直都是正确的。我已经修复了我的答案以反映这一点。感谢您耐心地提出问题,为我指明正确的方向并让我理解这一点。 @legends2k 我以为我是被纠正的人,哈哈!好吧,感谢的确认:)【参考方案2】:

通常,scancodes 是键盘(硬件)向操作系统发出的真实值,而键码是操作系统/库根据所选布局将其映射到的内容。布局决定了扫描码到一些虚拟键码之间的映射。它是操作系统设置的一部分。这里的layout,是指功能布局;还有机械和视觉布局。在 Wikipedia 中阅读有关 keyboard layouts 的更多信息。扫码和虚拟键的概念是explained better,在MSDN中有说明。

但是,SDL 使用 scancode 来表示不同的含义:美国 QWERTY 键盘中与所讨论的位置相同的键的扫描码。这是基于位置来表示密钥的独立于设备的方式。这被埋在SDL's manual一个不寻常的位置:

扫描码是独立于布局的。将此视为“用户按下 Q 键,就像在美国 QWERTY 键盘上一样”,无论这实际上是欧洲键盘还是德沃夏克键盘或其他任何东西。扫描码始终是相同的关键位置。

键码是依赖于布局的。可以把它想象成“用户按下了特定键盘上标有‘Q’的键。”

例如,如果您在美国 QWERTY 键盘上按下 CAPS LOCK 右侧的两个键,它将报告 SDL_SCANCODE_S 的扫描码和 SDLK_S 的键码。 Dvorak 键盘上的相同键,将报告 SDL_SCANCODE_S 的扫描码和 SDLK_O 的键码。

在上面的引用中,手册中的布局是指功能布局。关于键盘的手册的main part 对此问题有点简短:

SDL_Scancode 值用于表示键盘按键在键盘上的物理位置。

SDL_Keycode 值映射到键盘的当前布局并与 SDL_Scancode 相关联。

使用哪个由应用程序决定:扫描码适用于控件依赖于布局的情况(例如,“WASD”键作为左手箭头键),而键码更适合控件依赖于布局的情况。取决于字符(例如,Inventory 的“I”键)。

在上面的引用中,手册中的布局是指机械/物理布局。所以对于字符的控制,比如使用scancode比较好,而对于接收用户名keycode比较好。

【讨论】:

以上是关于SDL 物理键码和 SDL 虚拟键码有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

键盘扫描码 ASCII码的区别?

无法从虚拟键码转换为 unicode

获得虚拟键键码

在哪里可以找到 Mac 虚拟键码列表?

尖括号的虚拟键码

如何将虚拟键码转换为字符码?