按住右 Alt 键时,GetAsyncKeyState() 返回 VK_LCONTROL 参数的错误值

问题描述 投票:0回答:3

我想知道我是否做错了什么,或者这是否是 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 上进行开发。

c++ winapi keyboard-shortcuts
3个回答
1
投票

我无法使用以下修改后的代码重现它。

#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时,会生成以下快照。 enter image description here


0
投票

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


0
投票

也遇到了这个问题,并以某种方式发现了这个 - https://en.wikipedia.org/wiki/AltGr_key

这似乎是 Windows 中的一种黑客攻击,可以在没有按钮的键盘上支持 Alt Gr(就像在上网本上一样)。 Windows 将 AltGr(右 Alt)映射到 Ctrl+Alt,然后将 Ctrl+Alt+[某个键] 映射到其他字符。

© www.soinside.com 2019 - 2024. All rights reserved.