GetKeyState如何正常工作?

时间:2018-06-06 09:11:52

标签: windows keylogger getmessage

我一直在努力了解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函数将看不到用户输入该另一个程序的输入,因为该输入未发送到您的输入队列。

0 个答案:

没有答案