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

Low*_*Sky 15 c keyboard scancodes sdl-2

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

Que*_*tin 19

请参阅SDL文档.扫描码表示按键的物理位置,以标准QWERTY键盘为模型,而键码则是按键获得的字符.

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


leg*_*s2k 5

通常,扫描码是键盘(硬件)发射到OS的真实值,而键码是OS /库根据所选布局将其映射到的值.布局决定了扫描码与某些虚拟键码之间的映射.它是操作系统设置的一部分.在这里,通过布局,我的意思是功能布局; 还有机械和视觉布局.阅读Wikipedia中有关键盘布局的更多信息.扫描代码和虚拟密钥的概念可以通过MSDN中的说明更好地解释.

但是,SDL使用扫描码来表示不同的东西:美国QWERTY键盘中键的扫描码,其位置与相关位置相同.它是基于设备独立的方式,根据其位置表示密钥.这被隐藏在SDL手册中的一个不寻常的位置:

扫描码意味着与布局无关.将此视为"用户按下Q键,就像在美国QWERTY键盘上一样",无论这实际上是欧洲键盘还是德沃夏克键盘等等.扫描码始终是相同的键位置.

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

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

在上面的引用中,通过布局,手册表示功能布局.关于键盘的手册的主要部分是关于这个问题的一点简要介绍:

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

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

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

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