我想知道我是否做错了什么,或者这是否是 Windows 错误。这是我的代码:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
bool quit = false;
while (!quit)
{
bool rightAltMod = GetAsyncKeyState(VK_RMENU);
bool leftControlMod = GetAsyncKeyState(VK_LCONTROL);
//press and hold right alt to see the bug
cout << "rAlt pressed " << rightAltMod << ", lCtrl pressed " << leftControlMod << "\n";
quit = GetAsyncKeyState(VK_ESCAPE);
}
return 0;
}
错误(?)是当我按住Right-Alt时,
GetAsyncKeyState()
也将其检测为Left-Ctrl。
如果这是一个错误,有什么解决方法吗?
除了使用汇编器直接访问键盘缓冲区之外,我没有任何想法。
我正在 Windows 10 x64 21H1 上进行开发。
我无法使用以下修改后的代码重现它。
#include <iostream>
#include <bitset>
#include <Windows.h>
using namespace std;
int main()
{
bool quit = false;
while (!quit)
{
SHORT rightAltMod = GetAsyncKeyState(VK_RMENU);
SHORT leftControlMod = GetAsyncKeyState(VK_LCONTROL);
//press and hold right alt to see the bug
if (rightAltMod != 0)
{
std::bitset<16> y(rightAltMod);
cout << "rAlt pressed " << y;
}
if (leftControlMod != 0)
{
std::bitset<16> z(leftControlMod);
cout << "lCtrl pressed " << z;
}
if (rightAltMod || leftControlMod)
{
cout << "\n";
}
quit = GetAsyncKeyState(VK_ESCAPE);
}
return 0;
}
我已经找到了导致该行为的原因 - 它与键盘布局有关。该错误发生在波兰程序员布局上,切换到 EN-US 布局后工作正常。 好吧,我仍然需要解决这个问题,但为此我将创建一个单独的问题。
也遇到了这个问题,并以某种方式发现了这个 - https://en.wikipedia.org/wiki/AltGr_key。
这似乎是 Windows 中的一种黑客攻击,可以在没有按钮的键盘上支持 Alt Gr(就像在上网本上一样)。 Windows 将 AltGr(右 Alt)映射到 Ctrl+Alt,然后将 Ctrl+Alt+[某个键] 映射到其他字符。