根据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); }
但是,当我用0x12
replace虚拟键码时,根据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
)键的唯一方式,但它也不是窗口循环的方式 。 现在你们都有了。