在运行下面的代码片段时,每次点击一个键时,都会调用 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/