Winapi 从windows.h获取AsyncKeyState

Winapi 从windows.h获取AsyncKeyState,winapi,Winapi,我将使用以下代码来解释我的问题: #include <Windows.h> #include <iostream> int main() { bool toggle = 0; while (1) { if (GetAsyncKeyState('C') & 0x8000) { toggle = !toggle; if (toggle) std::cout <

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

#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'))
然而,为了实现我想要的行为,也就是任何文本输入的工作方式,它会等待1秒钟,如果你仍然按下按钮,它会以一定的速度开始发送垃圾邮件,我需要写

(GetAsyncKeyState('C') & 1)
警察说

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


有人能澄清一下吗?

MSDN会告诉你为什么在你链接到的同一页上

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

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

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


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

这是任何文本输入的工作方式-错误。任何可靠的文本输入实现都使用同步字符消息,这是调用TranslateMessage的结果。您选择了错误的解决方案。是的,我忘了提到我打算在.txt文档或google搜索中复制键入。记事本中的键入是使用同步字符消息实现的。如果您有兴趣了解Google Chrome如何实现文本输入,您可以阅读其源代码。如果它没有使用同步字符消息,我会感到惊讶。目前还不清楚您打算如何使用键盘状态检索API注入输入。为什么不创建一个带有编辑控件的Windows程序?但是如果MSDN告诉我不要查看该位,我将如何实现该行为?请参阅我答案的底部。不要使用GetAsyncKeyState。Get[Async]KeyState不使用输入。若要在控制台应用程序中立即做出反应,可以使用SetConsoleMode关闭输入处理。检查aloso ReadConsoleInput。
(GetAsyncKeyState('C') & 1)