ALT KEY的虚拟键码

根据MSDN,我正在制作钩子和捕捉键盘虚拟键码, 这些是存在的关键码。

每个关键代码都能正常工作,因为我会在代码的下面给出一个例子。

#include <stdio.h> #include <stdlib.h> #include <windows.h> HHOOK altKey; KBDLLHOOKSTRUCT kbdHK; MSG message; LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar); int main(int argc, char *argv[]) { altKey = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, NULL, 0); while(GetMessage(&message, NULL, 0, 0) > 0){ TranslateMessage(&message); DispatchMessage(&message); } return 0; } LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar){ if(nCode >= 0){ if(wPar == 256){ kbdHK = *(KBDLLHOOKSTRUCT *)lPar; if(kbdHK.vkCode == 0x20){ printf("spacebar pressed!!\n"); } } } return CallNextHookEx(NULL, nCode, wPar, lPar); } 

但是,当我用0x12replace虚拟键码时,根据MSDN ALT键,我不能得到结果。 可能是什么问题呢?

编辑

当我使用这一行代码,我可以得到每个键的scanCode ,但不是再次有意思的Alt键。

 printf("%d", kbd.scanCode); 

我建议挂钩WM_SYSKEYDOWN消息 ,并注意这些值对应于常常具有实际标识符(本例中为VK_MENU )的VK_MENU 。 毕竟,作为程序员,我们很早就教会不要使用魔法数字

WM_SYSKEYDOWN消息

当用户按下 F10键(激活菜单栏) 或按住ALT键,然后按下另一个键 时,用键盘焦点张贴到窗口上

正如在注释中指出的另一个选择是使用GetAsyncKeyState 。 你不能使用vkCode看起来很奇怪,因为GetAsyncKeyState的参数GetAsyncKeyState 虚拟键码,所以你要使用的代码将会是:

 short result = GetAsyncKeyState(VK_MENU); if (!result) { // no alt keystrokes since last call } 

值得注意的是,这是您能够区分左键( VK_LMENU )和右键( VK_RMENU )键的唯一方式,但它也不是窗口循环的方式 。 现在你们都有了。