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)