winapi - 来自 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 应用程序(非抢占式)兼容,不应依赖该应用程序。
有人可以澄清一下吗?
解决方案
MSDN 会在您链接到的同一页面上告诉您原因!
尽管返回值的最低有效位指示自上次查询以来是否已按下该键,但由于 Windows 的抢占式多任务性质,另一个应用程序可以调用 GetAsyncKeyState 并接收“最近按下”位而不是您的应用程序。严格保留返回值的最低有效位的行为是为了与 16 位 Windows 应用程序(非抢占式)兼容,不应依赖该应用程序。
GetAsyncKeyState
为您提供“与硬件相关的中断级状态”,并且可能由窗口站/会话中的所有进程共享。
低位可能与您可以在控制面板中设置的键盘按键重复延迟有关,但这并不重要,因为 MSDN 告诉您不要查看该位。
GetAsyncKeyState
通常不是处理键盘输入的正确方法。控制台应用程序应该读取标准输入,或使用控制台 API。GUI 应用程序应该使用WM_CHAR
//窗口消息WM_KEYDOWN
。WM_KEYUP
推荐阅读
- tensorflow - Serving模式下的Tensorflow模型内存消耗大
- android - Android 通知不处理特殊字符
- javascript - 如何将叠加层悬停在flex容器中的flex项目上
- android - 如何在导航抽屉活动中更改 activity_main_drawer 的 Textsize
- r - 根据其他列的最旧组成员的值重新编码整个组的列
- c# - 二叉树搜索生成 StackOverflowException
- internationalization - Silverstripe 模板 i18n 翻译
- .net - ServicedComponent 服务器激活权限被拒绝
- python-3.x - 如何在来自 pandas 数据帧的 cx_Oracle 中使用命名绑定和批量插入(executemany)
- arrays - 比较 ClickHouse 行中的两个数组