c++ - 仅在按下键时调用函数,而不是在释放键时调用函数

标签 c++ c windows winapi keyboard-events

在运行下面的代码片段时,每次点击一个键时,都会调用 LowLevelKeyboardProc 函数。但问题是它在按下一个键和释放一个键时都被调用。这意味着,每次点击该函数被调用两次。但我希望该函数只在键被调用时被调用一次按下而不是在释放键时。

即使我可以在 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;
}

最佳答案

你不能改变 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
     }
}

关于c++ - 仅在按下键时调用函数,而不是在释放键时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880349/

相关文章:

c# - 在Visual Studio上禁用音频

c++ - 线程 C++ 的 lambda 内部函数调用

c - openssl api 函数引用问题

c++ - 关于C++中的虚函数覆盖

c - 谜题: "[] is symmetric"?

c - 带有 PlayBook NDK 的 libpurple

windows - 在 Windows 上更改 GTK+3 外观

windows - 如何在 Windows XP 的 CMD 中执行汇编语言代码?

c# - 差异 b/n 对象、引用、指针

c++ - 在 Windows XP 中使用 C/C++ 中的动态数组最简单的方法是什么?