为什么GetAsyncKeyState在按下ALT时会注册CTRL

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

我目前正在使用 GetAsyncKeyState 在 csharp 程序中注册按键。

我遇到的问题是,当按右 Alt (RMenu / vKey 165) 时,程序还会注册右 Control 按键 (RControlKey / vKey 162)。

我正在运行一个 for 循环来检查该方法的每个 vKey 整数,如下所示:

for (int i = 0; i < 254; i++)
{
    short keyState = GetAsyncKeyState(i);
    if(keyState < 0)
    {
        Debug.WriteLine(i);
    }
}

我尝试过滤掉 RControl 键,但我也想检测这个。

我错过了什么吗?有办法解决吗?

c# .net key
1个回答
0
投票

我认为问题是你如何检查按键是否被按下

根据文档,您应该比较最高有效位。试试这个:

按如下方式导入函数:

[DllImport("User32.dll")]
public static extern short GetAsyncKeyState(Keys ArrowKeys);

然后使用二进制 AND 运算符来检查导入函数返回的值是否设置了最高有效位:

for (int i = 0; i < 254; i++)
{
    var key = (Keys)i;
    bool isKeyDown = (GetAsyncKeyState(key) & 0x8000) > 0; 
    if (isKeyDown)
    {
        Console.WriteLine($"{i} => {key}");
    }
}

按下右 alt 键时的输出:

18 => Menu 
165 => RMenu 

您会看到两者,因为从键列表中,

18
表示“ALT键”并且 165 是一个更具体的值,表示“右侧 ALT 键”。

同样,按下右控制键会产生以下输出:

17 => ControlKey
163 => RControlKey
© www.soinside.com 2019 - 2024. All rights reserved.