25

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

4

2 回答 2

31

请参阅SDL 文档。Scancodes 代表按键的物理位置,仿照标准 QWERTY 键盘,而 Keycodes 是按键获得的字符。

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

于 2015-08-11T12:16:36.663 回答
14

通常,scancode是键盘(硬件)向操作系统发出的真实值,而 keycode 是操作系统/库根据所选布局将其映射到的内容。布局决定了扫描码到一些虚拟键码之间的映射。它是操作系统设置的一部分。这里的layout是指功能布局;还有机械和视觉布局。在 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”键)。

在上面的引用中,手册中的布局是指机械/物理布局。所以对于控制字符,比如使用扫描码比较好,而对于接收用户名keycode比较好。

于 2015-08-11T12:34:25.957 回答