0
如下面的代码片段所示,每次轻按一个按键时,函数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;
}
我WINAPI是有点生疏,但我相信,CallNextHookEx方法也应该是在他不处理该消息的情况下调用。 –
@Benjamin Lindley - 是的,但程序员可能想隐藏一些键盘消息,在这种情况下CallNextHookEx不会被调用。 –
来自MSDN:如果nCode小于零,则挂钩过程必须将消息传递给CallNextHookEx函数而无需进一步处理,并且应返回由CallNextHookEx返回的值。所以,如果nCode <0,只需返回CallNextHookEx - 这是强制性的。 –