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

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

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

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

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

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

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

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

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

在上面的引用中,通过布局,手册表示function布局。 关于键盘的手册的主要部分是关于这个问题的一点简要说明:

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

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

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

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