翻译《The Old New Thing》 - What’s the difference between GetKeyState and GetAsyncKeyState?

本文讲述了GetKeyState和GetAsyncKeyState函数在处理键盘状态时的不同,强调了GetKeyState适用于大部分用户界面开发,特别是在处理用户输入事件时,而GetAsyncKeyState则提供即时状态。上下文菜单处理应避免直接依赖这两个函数,而是检查相应标志。
摘要由CSDN通过智能技术生成

What's the difference between GetKeyState and GetAsyncKeyState? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20041130-00/?p=37173

Raymond Chen  2004年11月30日


GetKeyState 和 GetAsyncKeyState 有什么差别?

简要

        这篇文章阐述了 GetKeyStateGetAsyncKeyState 两个函数的区别。GetKeyState 反映的是基于已从输入队列中检索的消息的键盘状态,而不会立即反映用户的输入,特别是如果用户切换到另一个程序,或者输入尚未被程序的消息循环处理。相反,GetAsyncKeyState 提供了键盘的即时状态,不依赖于消息循环。 对于用户界面开发,通常推荐使用 GetKeyState,因为它能够提供在特定输入生成时的键盘状态。例如,要区分鼠标单击和 Alt+鼠标单击,就需要使用 GetKeyState 来确定在鼠标点击时 Alt 键是否被按下。文章还指出,在实现上下文菜单处理器时,不应使用这两个函数,而应检查相应的标志来判断是否显示扩展命令或调整行为。最后,文章通过这些解释帮助读者理解用户可能遇到的特定行为。

正文

        关于 `GetKeyState` 函数和 `GetAsyncKeyState` 函数的区别,我注意到存在一些误解。

        GetKeyState 函数提供了虚拟键的状态,这意味着它反映的键盘状态是基于你从输入队列中获取的消息。这并不是物理键盘的实际状态:

- 如果用户提前输入了文字,`GetKeyState` 函数在你没有使用 `PeekMessage` 或 `GetMessage` 函数从输入队列中取出消息之前,是不会反映这些变化的。


- 如果用户切换到了另一个程序,`GetKeyState` 函数也不会检测到用户在那个程序中的输入,因为那些输入并没有发送到你的输入队列。

        你应该在什么情况下使用 `GetKeyState`,什么情况下使用 `GetAsyncKeyState`?

        对于大多数用户界面的开发,你通常会选择 `GetKeyState`。

        如果你正在处理一个输入消息,并想要了解在该输入产生时哪些键被按下,那么你应该使用 `GetKeyState`。例如,如果你想区分鼠标的普通左键点击和 Alt+左键点击,你需要使用 `GetKeyState` 来检查 Alt 键的状态(出于历史原因,它被称为 VK_MENU)。你关心的是用户点击鼠标的那一刻 Alt 键是否被按下,而不是当前瞬间 Alt 键是否被按下。用户在点击之后、消息被处理之前是否松开了 Alt 键,这一点并不重要。

        如果你在实现一个上下文菜单处理器,你不应该使用 `GetKeyState` 或 `GetAsyncKeyState`,因为上下文菜单可以通过程序的方式而非用户操作来触发。对于 `IContextMenu::QueryContextMenu`,你应该检查 `CMF_EXTENDEDVERBS` 标志来判断是否需要显示扩展命令,而不是直接检查键盘状态。同样,对于 `IContextMenu::InvokeCommand`,如果你想根据Shift键的状态来调整行为,你应该检查 `CMIC_MASK_CONTROL_DOWN` 和 `CMIC_MASK_SHIFT_DOWN` 标志。

        现在,你已经了解了 `GetKeyState` 和 `GetAsyncKeyState` 的区别,你可以解释这位用户所遇到的行为了。

[更新:2004年12月1日,修正了一个小的拼写错误。]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0007

可不可奖励我吃只毛嘴鸡 馋😋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值