SDL物理密钥代码和SDL虚拟密钥代码之间有什么区别?

时间:2015-08-11 12:10:43

标签: c keyboard sdl-2 scancodes

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

2 个答案:

答案 0 :(得分:17)

the SDL documentation。扫描码表示按键的物理位置,以标准QWERTY键盘为模型,而键码则是按键获得的字符。

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

答案 1 :(得分:5)

通常,scancode是键盘(硬件)向OS发出的真值,而键码是OS /库根据所选布局将其映射到的值。布局决定了扫描码与某些虚拟键码之间的映射。它是操作系统设置的一部分。在这里,通过 layout ,我的意思是功能布局;还有机械和视觉布局。在维基百科中阅读有关keyboard layouts的更多信息。扫描代码和虚拟密钥的概念是explained better,在MSDN中有说明。

但是,SDL使用 scancode 来表示不同的东西:US QWERTY键盘中键的扫描码,其位置与相关位置相同。它是基于设备独立的方式,根据其位置表示密钥。这被埋在SDL's manual的一个不寻常的位置:

  

扫描码是与布局无关的。将此视为“用户按下Q键,就像在美国QWERTY键盘上一样”,无论这实际上是欧洲键盘还是Dvorak键盘等等。扫描码始终是相同的键位置。

     

密钥代码是与布局相关的。将此视为“用户按下了特定键盘上标有'Q'的键。”

     

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

在上面的引用中,通过布局手册意味着功能布局。关于键盘的手册的main part在这个问题上有点简短:

  

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

     

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

     

使用哪一个留给应用程序:扫描码适用于控件与布局相关的情况(例如“WASD”键作为左手箭头键),而键码更适合控制的情况字符依赖(例如库存的“I”键)。

在上面的引用中,通过布局,手册指的是机械/物理布局。因此,对于控制角色,例如,使用扫描码更好,而接收用户的名称键码更好。

相关问题