我一直在努力理解 GetKeyState 的运作方式。我已经进行了无休止的谷歌搜索,但还没有弄清楚它是如何工作的
根据MSDN:
当线程从其消息队列中读取关键消息时,此函数返回的关键状态会发生变化。
看看下面的代码。我没有创建消息处理循环。65表示字符“A”的虚拟键。
while(true) {
printf("the character %c, the vkey_state is %x",
MapVirtualKey(65, MAPVK_VK_TO_CHAR),GetKeyState(65) & 0x8000);
Sleep(150);
}
我在程序的窗口控制台上按了键盘上的“A” 。有时,vkey_state 的值是预期的 0x8000,有时不是。
引擎盖下到底发生了什么?我没有编写任何消息处理代码,所以我假设它是自动创建的。当我按“A”时,一个WM_KEYDOWN被发送到我的线程消息队列。当我释放键“A”时,一个WM_KEYUP被发送到我的线程消息队列。其他与密钥相关的消息可能会在两者之间发送。当我调用 GetKeyState 时会发生什么?什么时候它将返回值的 MSB 设置为“1”?什么时候变回0?它与对 GetMessage 的调用有关吗?
此外——最让我困惑的是——当我切换到另一个程序(cmd.exe)并输入“A”时,我的程序能够在后台监控它——但是 cmd.exe 线程有另一条消息队列 - 为什么它有效?但是 - 如果我以提升模式(高完整性)启动 cmd.exe,它就不起作用。
这与我在这里找到的信息相矛盾: https ://blogs.msdn.microsoft.com/oldnewthing/20041130-00/?p=37173
如果用户已切换到另一个程序,则 GetKeyState 函数将看不到用户在该其他程序中键入的输入,因为该输入未发送到您的输入队列。