来自windows.h的GetAsyncKeyState

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自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
";
            else std::cout << "Not pressed
";
        }
    }
}

测试,我看到了

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

具有相同的行为

(GetAsyncKeyState('C'))

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

(GetAsyncKeyState('C') & 1)

documentation

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

有人可以澄清一下吗?

答案

MSDN告诉您为什么在您链接的同一页面上!

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

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

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

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

以上是关于来自windows.h的GetAsyncKeyState的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 通过多线程同时播放多个哔声?

模拟锁定文件

安装了visual c 2008,自动生成一个项目,居然也过不了,fatal error C1083: 无法打开包括文件:“windows.h

Visual Studio 强制桌面 API

windows.h是啥头文件

使用来自 x64 注入器的 x86 dll 注入 x86 目标