0

以下のスニペットが実行されると、キーがタップされるたびに関数LowLevelKeyboardProcが呼び出されます。しかし問題は、キーを押した時とキーを離した時の両方で呼び出されることです。つまり、1回のタップで関数が2回呼び出されるということです。キーを離したときではなく、押されたとき。

関数LowLevelKeyboardProc内でキーの押下とリリースをフィルタリングできても、問題ありません。これを行う方法はありますか?

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
  // call the function only if the key is pressed,else ( i.e key released) do nothing
}

BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved){
  handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0);
  MSG msg;

  while(GetMessage(&msg, NULL, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) { // ENTRY POINT
 if(hookThreadHandle==NULL) { 
    LPTHREAD_START_ROUTINE lpStartAddress = &installHook;
    hookThreadHandle = CreateThread(NULL, 0, lpStartAddress, NULL, 0, &hookThreadId);
 }
 return TRUE;
}
4

1 に答える 1

1

LowLevelKeyboardProc の呼び出し方法を変更することはできませんが、関数内で呼び出しの理由を知ることができます。

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
     if ( nCode < 0 )
     {
         return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
     }

     if ( wParam == WM_KEYDOWN )  // possibly you want also WM_SYSKEYDOWN
     {
         // do what you need
     }
}
于 2012-10-14T08:06:21.250 に答える