结构体SDL_Keysym
具有SDL_Scancode
和SDL_Keycode
成员,它们之间有什么区别呢?文档并没有很清楚地解释这一点。我尝试了两者,它们似乎做相同的事情。
一般而言,扫描码是键盘(硬件)发送到操作系统的真实值,而按键码是基于所选布局图映射到的操作系统或库。布局决定了扫描码到某些虚拟键码之间的映射关系,它是操作系统设置的一部分。这里,通过 布局 ,我指的是功能布局;还有机械布局和视觉布局。在维基百科中了解更多关于键盘布局的信息。扫描码和虚拟键的概念在MSDN中 用插图更好地解释。
然而,SDL 使用 扫描码 意味着不同的事情:与所询问的按键位置相同的美式 QWERTY 键盘上的按键扫描码。这是以设备无关的方式表示基于其位置的按键。在 SDL 手册 中,这被埋藏在一个不寻常的位置:
扫描码是独立于布局的。可以将其视为“用户按下了在美国QWERTY键盘上的Q键”,而与此实际有欧洲键盘或Dvorak键盘无关。扫描码始终是相同的按键位置。 按键码是与布局相关的。可以将其视为“用户按下了特定键盘标记为'Q'的按键”。 例如,如果您按下 US QWERTY 键盘上 CAPS LOCK 右侧两个键的键,则会报告 SDL_SCANCODE_S 的扫描码和 SDLK_S 的按键码。在 Dvorak 键盘上相同的按键,则会报告 SDL_SCANCODE_S 的扫描码和 SDLK_O 的按键码。