вызов функции только при нажатии клавиши, а не при ее отпускании

Как показано ниже, каждый раз при нажатии клавиши функция 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;
}

0

Решение

Вы не можете изменить способ вызова 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
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]