键盘钩子中的一些常用参数转换

来源:互联网 发布:刺客聂隐娘影评 知乎 编辑:程序博客网 时间:2024/06/08 06:52

得到当前哪个键被按下,返回按键的name

  for(int i=0;i<=255;++i)
  {
   if( GetKeyState(i) & 0x80000000 )
   {
    TCHAR str[256];
    memset(str,0,256*sizeof(TCHAR));
    GetKeyNameText((MapVirtualKey(i,0)<<16)+1,str,256);
  }

函数结果:如果A键被按下,返回一个字符‘A’

转换当前的键盘消息,得到是哪个字符键被按下

ToAscii(keyWParam,HIWORD(keyLParam),  m_KeybdData, &dwKey, 0) ;

keyWparam 和 lParam 为keydown时的按键消息的wParam,lParam, m_KeybdData为一个256的键盘缓冲区,使用GetKeyboradState得到,函数结果:如果A键被按下,将会返回‘A’的ASCII值,可以通过m_KeybdData区分大小写的。

低级钩子到普通钩子的键盘参数转换:

 KBDLLHOOKSTRUCT *pkbdllHook   = (KBDLLHOOKSTRUCT*)lParam;
 WPARAM keyWParam = pkbdllHook->vkCode;
 LPARAM keyLParam = pkbdllHook->scanCode;
 keyLParam = keyLParam << 16;
 keyLParam |= 0x1;
 if(pkbdllHook->flags & 0x01)
  keyLParam |= 0x1000000;
 if(pkbdllHook->flags & 0x20)
  keyLParam |= 0x20000000;
 if(pkbdllHook->flags & 0x80)
  keyLParam |= 0xc0000000;

 if(keyWParam == VK_LSHIFT || keyWParam == VK_RSHIFT)
  keyWParam = VK_SHIFT;
 else if(keyWParam == VK_LCONTROL || keyWParam == VK_RCONTROL)
  keyWParam == VK_CONTROL;
在低级钩子的处理过程中,使用AsyncGetKeyState会失败,使用GetKeyState在键盘按键释放时处理过程中也会得到值,这一点与在其它的处理过程中得到的不一样的,例如IME的ProcessChar中使用GetKeyState在按键释放时得到的是空值,但是在低级钩子的处理过程中会得到正确的值。

这说明低级钩子如果处理过程函数不返回,键盘的状态会保持为处理前的状态,使用的GetKeyStae返回值证实了这点.

在低级钩子中使用GetKeyboardState也会失败,应该判断hook函数里的wParam,为WM_KEYDOWN时将相应的值设为80,为WM_KEYUP时设为0,如果程序要处理VK_SHIFT,VK_CTRL,应该判断pkbdllHook->vkCode,在VK_LSHIFT、VK_RSHIFT时将VK_SHIFT的值设置,因为vcCode传的值是区分左右SHIFT的,而普通的KEYDOWN是不会区分此值。

获取大小写转换键的状态,

if( GetKeyState(VK_CAPITAL) & 1)
  m_KeybdData[VK_CAPITAL] =  1;
 else
  m_KeybdData[VK_CAPITAL] =  0;

 
原创粉丝点击