首页 > 解决方案 > 来自 windows.h 的 GetAsyncKeyState

问题描述

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

#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)

文件说_

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

有人可以澄清一下吗?

标签: winapi

解决方案


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

尽管返回值的最低有效位指示自上次查询以来是否已按下该键,但由于 Windows 的抢占式多任务性质,另一个应用程序可以调用 GetAsyncKeyState 并接收“最近按下”位而不是您的应用程序。严格保留返回值的最低有效位的行为是为了与 16 位 Windows 应用程序(非抢占式)兼容,不应依赖该应用程序。

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

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

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


推荐阅读