当前位置: 首页 > news >正文

GetKeyState()和GetAsynKeyState()的差异

书籍:《Visual C++ 2017从入门到精通》的2.4.2 MFC应用程序类型

环境:visual studio 2022

内容:【例2.40】通过按键消息显示用户按键的键值

说明:以下内容大部分来自腾讯元宝

GetKeyState() 和 GetAsyncKeyState() 是 Windows API 中用于检测按键状态的常用函数,其核心差异如下:


1. 工作机制

  • GetKeyState()
    基于 ​消息队列 获取按键状态,仅反映 ​最后一次键盘消息处理时的按键状态。例如,在 WM_KEYDOWN 消息处理函数中调用时,它返回生成该消息时的按键状态。

    适用场景:需要在消息处理逻辑中同步获取按键状态(如响应快捷键)。
  • GetAsyncKeyState()
    直接查询 ​硬件硬件中断 实时获取按键状态,不受消息队列影响。无论程序是否处于消息处理阶段,调用时立即返回当前按键状态。

    适用场景:需要实时检测按键(如游戏循环、后台监控)。

2. 返回值结构

  • GetKeyState()
    返回 SHORT 类型(16位),​最高位(第15位)​ 表示按键是否被按下(1=按下,0=抬起),​最低位(第0位)​ 表示按键是否被触发(如 Caps Lock 灯状态)。

    判断按键按下
    if (GetKeyState(VK_CONTROL) & 0x8000)  // 最高位为1表示按下
  • GetAsyncKeyState()
    返回 SHORT 类型,​最高位 表示当前按键是否被按下,​最低位 表示自上次调用后是否被触发过(1=触发过)。

    判断按键按下
    if (GetAsyncKeyState(VK_SPACE) & 0x8000)  // 最高位为1表示按下

3. 使用限制与性能

  • GetKeyState()

    • 只能在消息处理函数中使用,否则无法获取有效状态。
    • 性能较高,适合频繁调用(如每帧检测)。
    • 潜在陷阱:若在循环中直接使用(如 while(GetKeyState(...))),可能导致死循环。
  • GetAsyncKeyState()

    • 无消息队列依赖可在任意位置调用
    • 性能较低,频繁调用可能影响性能。
    • 物理按键检测:不受键盘映射影响(如 VK_LBUTTON 始终检测鼠标左键)。

4. 典型场景对比

场景推荐函数示例代码
响应快捷键(如 Ctrl+S)GetKeyState()if (GetKeyState(VK_CONTROL) & 0x8000 && nChar == 'S')
游戏循环实时检测按键GetAsyncKeyState()if (GetAsyncKeyState(VK_SPACE) & 0x8000)
检测物理按键状态(如外接键盘)GetAsyncKeyState()if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)

5. 注意事项

  • 组合键处理
    使用 GetKeyState() 时,需确保组合键(如 Ctrl+Alt+Delete)在消息队列中同时触发。
  • 多线程环境
    GetAsyncKeyState() 可跨线程检测按键,但需注意焦点窗口问题(若其他窗口拥有焦点,可能返回 0)。
  • Unicode 兼容性
    两者均支持 Unicode 编码的虚拟键码(如 VK_RETURN 对应回车键)。

总结

维度GetKeyState()GetAsyncKeyState()
数据来源消息队列硬件中断
实时性非实时(依赖消息处理)实时(调用即返回)
性能较低
适用场景消息驱动的按键响应需要实时检测的复杂场景(如游戏、后台监控)

通过合理选择函数,可优化程序响应速度与逻辑准确性。若需进一步了解虚拟键码列表,可参考微软官方网页。

相关文章:

  • 音视频系列——Websockets接口封装为Http接口
  • 智能追踪台灯需求文档
  • 尝试使用tauri2+Django+React的项目
  • 如何获取与testFile同级目录下的所有文件?
  • 企业级AI架构探索:业务驱动,场景优先
  • 集成平台是选择专业iPaaS厂商还是大型软件企业?
  • 善用批处理的for命令倍增效率(附彩蛋:windows官方bug)
  • 【面试场景题-你知道readTimeOutException,会引发oom异常吗】
  • JavaScript 获取 URL 中参数值的详解
  • 【动态规划】详解混合背包问题
  • YOLO11改进-模块-引入空间带状注意力机制(Spatial Strip Attention,SSA)增强模型对空间信息处理能力的重要模块
  • Windows搭建免翻墙的BatteryHistorian
  • Animation - AI Controller控制SKM_Manny的一些问题
  • 笔记:代码随想录算法训练营day58:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
  • 成都文创浪潮中,国际数字影像产业园的标杆塑造之路
  • Netlify 的深度解析及使用指南
  • 深入探讨 `ip2region` 中三种初始化方法:newWithBuffer、newWithVectorIndex 和 newWithFileOnly
  • 针对耳鸣患者推荐的一些菜谱和食材
  • 产品更新 | 数字助决胜:华望M-Arch平台实现从体系模型到仿真推演
  • ManiWAV:通过野外的音频-视频数据学习机器人操作
  • 招行:拟出资150亿元全资发起设立金融资产投资公司
  • 公示!17个新职业、42个新工种亮相
  • 技术派|伊朗展示新型弹道导弹,美“萨德”系统真的拦不住?
  • 住宿行业迎“最火五一”:数千家酒店连续3天满房,民宿预订量创历史新高
  • 香港金紫荆广场举行五四升旗礼
  • 遭反特朗普情绪拖累?澳大利亚联盟党大选落败、党魁痛失议席