【问题标题】:calling a function only when a key is pressed not when it is released仅在按下键时调用函数,而不是在释放键时调用
【发布时间】:2012-10-04 12:36:28
【问题描述】:

当下面的 sn-p 运行时,每次点击一个键,都会调用函数 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;
}

【问题讨论】:

    标签: c++ c windows winapi keyboard-events


    【解决方案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
         }
    }
    

    【讨论】:

    • 我的winapi有点生疏了,但是我相信在他不处理消息的情况下也应该调用CallNextHookEx。
    • @Benjamin Lindley - 是的,但是程序员可能想要隐藏一些键盘消息,在这种情况下 CallNextHookEx 不会被调用。
    • 来自 MSDN:如果 nCode 小于零,则挂钩过程必须将消息传递给 CallNextHookEx 函数而不进行进一步处理,并且应该返回 CallNextHookEx 返回的值。因此,如果 nCode
    • 通常当 nCode >= 0 时也会调用 CallNextHookEx,但这是您的决定。例如,如果您想隐藏一些键盘消息,请不要调用 CallNextHookEx,而只需返回 TRUE。
    • @AlexFarber 隐藏一些键盘消息是什么意思?
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2014-04-17
    • 2015-08-22
    • 2021-03-18
    • 2020-06-25
    相关资源
    最近更新 更多