当我的一位客户提示他们使用 azerty 键盘并且无法使用我的产品时,我遇到了问题。所以我决定使用扫码而不是虚拟 key 。我找到了函数MapVirtualKey对我实现这一目标确实很有用。但在某些情况下,我不想使用 MapVirtualKey 函数,而是使用数字本身,例如 {if(isKeyDown[30])return 'A';} 但我浏览互联网并意识到一些消息来源告诉他们他们的键盘扫描码不像我的,如图所示 我不明白,为什么和我键盘的扫码不一样,甚至和这个MS scan code table不一样?
所以我真的想知道,使用安全吗
if (isDownNow[48])
return 'B';
而不是
if (isDownNow[MapVirtualKey('B', MAPVK_VK_TO_VSC)])
return 'B';
感谢您的阅读:)
编辑: 我想我有一个解决上述问题的方法,而不是每次都调用MapVirtualKey,我会将 map 存储在一个数组中。但新的问题又来了。 我没有 azerty 键盘,所以我无法测试这个,我只有 qwerty 键盘,所以我对这个问题感到困惑: 我有这个功能来存储我的 map 。
void MapKeyData()
{
for (int i = 0; i < KEYS_SIZE; i++)//KEYS_SIZE=255
mapKey[i] = MapVirtualKey(i, MAPVK_VK_TO_VSC);//mapKey is unsigned char array
}
但我想要普通键盘(qwerty 键盘)中的 Z 与 azerty 键盘中的 W 映射。但正如上面的 MapKeyData 函数一样,我认为 qwerty 键盘中的 Z 仍然与 azerty 键盘中的 Z 映射,这绝对不是我的目的,我想保留键盘布局,而不是按键本身。但正如我所说,我不知道每个键盘上的扫描码是否相同,因为第一张图片显示键码与我的扫描码不同。
感谢您的阅读:)
最佳答案
是的,所有键盘布局上的扫描码都是相同的。我通过将键盘布局更改为其他布局来测试这一事实 with windows settings .
因此,为了解决 PC 上不同的键盘布局问题,我创建了一个 unsigned char
数组来存储按键的扫描代码:该项目的索引是我的标准 QWERTY 键盘上的按键,即该项目的值是扫描码。这样,我可以轻松地将 QWERTY 上的按键映射到其扫描码,以便我可以使用扫描码。
mapKey['A'] = 30; //Key 'A' on QWERTY keyboard has scan code = 30
mapKey['B'] = 48;
mapKey['C'] = 46;
mapKey['D'] = 32;
mapKey['E'] = 18;
mapKey['F'] = 33;
mapKey['G'] = 34;
mapKey['H'] = 35;
mapKey['I'] = 23;
mapKey['J'] = 36;
mapKey['K'] = 37;
mapKey['L'] = 38;
mapKey['M'] = 50;
mapKey['N'] = 49;
mapKey['O'] = 24;
mapKey['P'] = 25;
mapKey['Q'] = 16;
mapKey['R'] = 19;
mapKey['S'] = 31;
mapKey['T'] = 20;
mapKey['U'] = 22;
mapKey['V'] = 47;
mapKey['W'] = 17;
mapKey['X'] = 45;
mapKey['Y'] = 21;
mapKey['Z'] = 44;
mapKey[VK_LEFT] = 75;
mapKey[VK_RIGHT] = 77;
mapKey[VK_RETURN] = 28;
... more if needed
关于layout - 所有键盘上的扫描码都一样吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38058419/