来自windows.h的GetAsyncKeyState

时间:2018-04-24 15:56:10

标签: winapi

我将使用以下代码来解释我的问题:

#include <Windows.h>
#include <iostream>

int main()
{
    bool toggle = 0;
    while (1)
    {
        if (GetAsyncKeyState('C') & 0x8000)
        {
            toggle = !toggle;
            if (toggle) std::cout << "Pressed\n";
            else std::cout << "Not pressed\n";
        }
    }
}

测试,我看到了

(GetAsyncKeyState('C') & 0x8000) // 0x8000 to see if the most significant bit is 1

具有相同的行为
(GetAsyncKeyState('C'))

然而,要实现我想要的行为,这是任何文本输入的工作方式(它等待1秒,如果你仍然按下按钮,它开始以一定的速率发送垃圾邮件),我需要写

(GetAsyncKeyState('C') & 1)

documentation

  

为了与16位Windows应用程序(非抢占式)兼容,严格保留返回值的最低有效位的行为,不应该依赖它。

有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:0)

MSDN告诉您链接到同一页面的原因!

  

虽然返回值的最低有效位表示自上次查询以来是否按下了键,由于Windows的先发制人多任务特性,另一个应用程序可以调用GetAsyncKeyState并接收&#34;最近被迫&#34;位而不是您的应用程序。返回值的最低有效位的行为严格保留,以便与16位Windows应用程序(非抢占式)兼容,并且不应该依赖它。

GetAsyncKeyState为您提供与硬件相关的中断级状态&#34;并且可能由窗口站/会话中的所有进程共享。

低位可能连接到您可以在控制面板中设置的键盘键重复延迟,但这并不重要,因为MSDN会告诉您不要查看该位。

GetAsyncKeyState通常不是处理键盘输入的正确方法。控制台应用程序应该读取stdin,或使用控制台API。 GUI应用程序应使用WM_CHAR / WM_KEYDOWN / WM_KEYUP窗口消息。