GetAsyncKeyState() returns 按住右 alt 时 VK_LCONTROL 参数的错误值

GetAsyncKeyState() returns wrong value for VK_LCONTROL parameter when right alt is held down

我想知道我是否做错了什么,或者这是一个 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;
}

并且当我按住 Right-Alt 时,会生成以下快照。

我找到了导致该行为的原因 - 它与键盘布局有关。该错误发生在波兰程序员布局上,切换到 EN-US 布局后它工作正常。 好吧,我仍然需要解决这个问题,但为此我会创建一个单独的问题。