当我的一位客户抱怨他们使用azerty键盘并且他们无法使用我的产品时,我遇到了问题。所以我决定使用扫描代码而不是虚拟密钥。我发现函数MapVirtualKey对我来说非常有用。但在某些情况下,我不想使用MapVirtualKey函数,而是使用数字本身,如{if(isKeyDown [30])return' A&#39 ;;}但我绕着互联网去实现有些消息来源告诉他们他们的键盘扫描码不像我的,就像在这张图片中一样 我不理解它,为什么它与我的键盘扫描码不同,甚至与此MS scan code table不同
所以我真的很想知道,使用
是否安全if (isDownNow[48])
return 'B';
而不是
if (isDownNow[MapVirtualKey('B', MAPVK_VK_TO_VSC)])
return 'B';
感谢您阅读:)
修改 我想我有一个上述问题的解决方案,而不是每次调用MapVirtualKey,我将地图存储在一个数组中。但是出现了新的问题。 我没有azerty键盘所以我无法测试这个,我只有一个qwerty键盘,所以我对这个问题感到困惑: 我有这个功能来存储我的地图。
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映射,这绝对不是我的目的,我想保持键盘布局,而不是键本身。但正如我所说,我不知道每个键盘上的扫描码是否相同,因为第一张图片显示的是与我的扫描码不同的键码。
感谢阅读:)
答案 0 :(得分:0)
是的,扫描代码在所有键盘布局上都是相同的。我通过将键盘布局更改为其他布局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
答案 1 :(得分:0)
在此处查看my answer - tl; dr:使用WM_CHAR
,而不是MapVirtualKey