根据MSDN,我正在制作钩子并捕捉键盘虚拟键码, these are 存在的密钥代码。
每个密钥代码都可以正常工作,因为我将在我的代码下面给出一个示例。
#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);
}
但是当我根据MSDN将0x12
替换为ALT KEY的虚拟键码时,我无法得到结果。可能是什么问题?
修改:
当我使用这行代码时,我可以获得每个键的scanCode
,但不能再获得有趣的alt键。
printf("%d", kbd.scanCode);
答案 0 :(得分:2)
我建议挂钩the WM_SYSKEYDOWN
messages,并注意这些值对应的常量通常有实际标识符(在本例中为VK_MENU
)。毕竟,作为程序员,我们很早就教会不要使用魔术数字!
WM_SYSKEYDOWN消息
当用户按下 F10键(激活菜单栏)或按住ALT键然后按下其他键时,使用键盘焦点发布到窗口。
评论中指出的另一个选择是使用GetAsyncKeyState
。您无法使用 vkCode
的担忧似乎很奇怪,因为GetAsyncKeyState
参数 是虚拟密钥代码,毕竟,所以你要使用的代码将是:
short result = GetAsyncKeyState(VK_MENU);
if (!result) {
// no alt keystrokes since last call
}
值得注意的是,这是您能够区分左Alt(VK_LMENU
)和右Alt(VK_RMENU
)键的唯一方法,但它也是而不是窗口循环方式。现在你有两个。