WH_KEYBOARDのフックプロシージャサンプル

Posted on Sun 07 March 2010 in Windows

キーボードが押されてない状態から押された状態へ遷移した時と、押している状態から、押されていない状態へ遷移した時に、押されたキーの仮想コード、shift、ctrl、altのそれぞれの状態を表示するフックプロシージャのコード

WH_KEYBORDのフックプロシージャは、0を返すと他のフックプシージャやウィンドウメッセージを処理するウィンドウへメッセージを渡し、0以外を返すとメッセージを渡さない。

LRESULT KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode < 0 || nCode == HC_NOREMOVE)
    return ::CallNextHookEx(m_hHook, nCode, wParam, lParam);

  ::OutputDebugString("keyboard hook! ");
  if((lParam & 0xc0000000) == 0xc0000000){
    UINT optChar = 0;
    //check keyup shift
    if(::GetKeyState(VK_SHIFT) >= 0){
      ::OutputDebugString("shift ");
    }
    //check keyup ctrl
    if(::GetKeyState(VK_CONTROL) >= 0){
      ::OutputDebugString("ctrl ");
    }
    //check keydup alt
    if(!(lParam & 20000000)){
      ::OutputDebugString("alt ");
    }
    UINT code = wParam;
    char log[64];
    wsprintf(log, "%d up\n", code);
    ::OutputDebugString(log);
  }
  else if((lParam & 0xc0000000) == 0x00000000){
    UINT optChar = 0;
    //check keydown shift
    if(::GetKeyState(VK_SHIFT) < 0){
      ::OutputDebugString("shift ");
    }
    //check keydown ctrl
    if(::GetKeyState(VK_CONTROL) < 0){
      ::OutputDebugString("ctrl ");
    }
    //check keydown alt
    if(lParam & 0x20000000){
      ::OutputDebugString("alt ");
    }
    UINT code = wParam;
    char log[64];
    wsprintf(log, "%d down\n", c);
    ::OutputDebugString(log);
  }
  return TRUE;
}