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

28

结构体SDL_Keysym具有SDL_ScancodeSDL_Keycode成员,它们之间有什么区别呢?文档并没有很清楚地解释这一点。我尝试了两者,它们似乎做相同的事情。

2个回答

34

请参阅SDL文档。扫描码表示键的物理位置,模仿标准QWERTY键盘,而键码是按下键后所得到的字符。

在AZERTY键盘上,按下A会发出一个'Q'扫描码和一个'a'键码。


15

一般而言,扫描码是键盘(硬件)发送到操作系统的真实值,而按键码是基于所选布局图映射到的操作系统或库。布局决定了扫描码到某些虚拟键码之间的映射关系,它是操作系统设置的一部分。这里,通过 布局 ,我指的是功能布局;还有机械布局和视觉布局。在维基百科中了解更多关于键盘布局的信息。扫描码和虚拟键的概念在MSDN中 用插图更好地解释

然而,SDL 使用 扫描码 意味着不同的事情:与所询问的按键位置相同的美式 QWERTY 键盘上的按键扫描码。这是以设备无关的方式表示基于其位置的按键。在 SDL 手册 中,这被埋藏在一个不寻常的位置:

扫描码是独立于布局的。可以将其视为“用户按下了在美国QWERTY键盘上的Q键”,而与此实际有欧洲键盘或Dvorak键盘无关。扫描码始终是相同的按键位置。 按键码是与布局相关的。可以将其视为“用户按下了特定键盘标记为'Q'的按键”。 例如,如果您按下 US QWERTY 键盘上 CAPS LOCK 右侧两个键的键,则会报告 SDL_SCANCODE_S 的扫描码和 SDLK_S 的按键码。在 Dvorak 键盘上相同的按键,则会报告 SDL_SCANCODE_S 的扫描码和 SDLK_O 的按键码。
在上面的引用中,手册中的布局是指功能布局。关于键盘的主要部分在这个问题上有点简要。
SDL_Scancode 值用于表示键盘上键的物理位置。 SDL_Keycode 值映射到键盘当前布局,并对应于 SDL_Scancode。使用哪个取决于应用程序:Scancodes 适用于控件布局依赖情况(例如,“WASD”键作为左箭头键),而 Keycodes 更适用于控件字符依赖情况(例如,Inventory 的 “I” 键)。
在上述引文中,手册中的“布局”指的是机械/物理布局。因此,例如,使用 Scancode 控制角色更好,而接收用户姓名则更适合使用 keycode。

你提到过“SDL使用扫描码表示不同的含义”。SDL扫描码包含了USB文档中的数值,并且指的是键盘(硬件)发送给操作系统的真实数值。你所说的“不同的含义”是指什么? - undefined
这个答案已经在里面了,不是吗?SDL中的“scancode”有着不同的含义:它指的是在美国QWERTY键盘上与所讨论的按键位置相同的按键的扫描码。举个例子,如果用户使用Dvorak键盘并按下“,”,SDL会返回“SDL_SCANCODE_Q”。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接