我将使用以下代码来解释我的问题:
#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应用程序(非抢占式)兼容,严格保留返回值的最低有效位的行为,不应该依赖它。
有人可以澄清一下吗?
答案 0 :(得分:0)
MSDN告诉您链接到同一页面的原因!
虽然返回值的最低有效位表示自上次查询以来是否按下了键,由于Windows的先发制人多任务特性,另一个应用程序可以调用GetAsyncKeyState并接收&#34;最近被迫&#34;位而不是您的应用程序。返回值的最低有效位的行为严格保留,以便与16位Windows应用程序(非抢占式)兼容,并且不应该依赖它。
GetAsyncKeyState
为您提供与硬件相关的中断级状态&#34;并且可能由窗口站/会话中的所有进程共享。
低位可能连接到您可以在控制面板中设置的键盘键重复延迟,但这并不重要,因为MSDN会告诉您不要查看该位。
GetAsyncKeyState
通常不是处理键盘输入的正确方法。控制台应用程序应该读取stdin,或使用控制台API。 GUI应用程序应使用WM_CHAR
/ WM_KEYDOWN
/ WM_KEYUP
窗口消息。