我目前正在使用 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 键,但我也想检测这个。
我错过了什么吗?有办法解决吗?
我认为问题是你如何检查按键是否被按下。
根据文档,您应该比较最高有效位。试试这个:
按如下方式导入函数:
[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