ALT KEY

时间:2017-09-20 18:57:40

标签: windows winapi hook

根据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);
}

但是当我根据MSDN0x12替换为ALT KEY的虚拟键码时,我无法得到结果。可能是什么问题?

修改

当我使用这行代码时,我可以获得每个键的scanCode,但不能再获得有趣的alt键。

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

1 个答案:

答案 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)键的唯一方法,但它也是而不是窗口循环方式。现在你有两个。