Процедура обратного вызова Keyboard Hook не вызывается постоянно для VC ++ X64-битного приложения в Windows X64-битной системе - PullRequest
0 голосов
/ 23 мая 2019

Процедура обратного вызова хук клавиатуры не вызывается непрерывно для XC-битного приложения VC ++ в 64-битной системе Windows.

Мышь и хук сообщения установлены правильно с использованием API-интерфейса SetWindowsHookEx в 64-битном приложении.

Только для перехвата клавиатуры, который не работает. Чтобы установить перехват клавиатуры ниже, используется API для его установки и вызова процедуры обратного вызова ieKeyBoardHookProc.

m_hKbHook = SetWindowsHookEx (WH_KEYBOARD_LL, & KeyBoardHookProc, AfxGetInstanceHandle (), 0);*

Для битового приложения X86 оно успешно работает в системе Wndows 7. X86.

Я попробовал описанные ниже варианты 1. Я добавил цикл обработки сообщений после установки клавиатуры.пример: т.е.

m_hKbHook = SetWindowsHookEx(WH_KEYBOARD_LL, &KeyBoardHookProc, AfxGetInstanceHandle(), 0);

while (GetMessage(&msg, NULL, 0, 0) != 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

2.

SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyBoardHookProc, AfxGetInstanceHandle(), 0);

оба не работают ..

Диалоговое приложение содержит ниже src для запуска потока:

theApp.m_pthrHookThread = AfxBeginThread(RUNTIME_CLASS(CHookTestThread ), 0, 0, 0);

HHOOK   m_hKbHook;

then load the hook dll at run time for the 

//.h file
class CHookTestThread : public CWinThread
{
}

//.cpp file
BOOL CHookTestThread ::InitInstance()
{
    m_hKbHook = SetWindowsHookEx(WH_KEYBOARD_LL, &KeyTestHookProc, AfxGetInstanceHandle(), 0);
    if (!m_hKbHook)
    {
        AfxMessageBox(_T("Could not set the lowlevel keyboard hook"));
    }


    return TRUE;
}

LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{

return (((CHookTestThread *)theApp.m_pthrHookThread )->KeyTestHook(nCode, wParam, lParam));
}

LRESULT CHookTestThread ::KeyTestHook(int nCode, WPARAM wParam, LPARAM lParam)
{

//handle shortcut keys as per virtual key code..

if (nCode < 0)
        return CallNextHookEx(m_hKbHook, nCode, wParam, lParam);


return CallNextHookEx(m_hKbHook, nCode, wParam, lParam);

}

Ожидаемые результаты: после установки хука клавиатуры KeyHookProc должен вызываться непрерывно при каждом нажатии клавиши на клавиатуре и перехватывать сообщение WM_KEYDOWN или WM_SYKEYDOWN внутри процедуры обратного вызова.

Фактические результаты: после установки хука клавиатуры KeyHookProc не вызывается непрерывновсякий раз, когда мы нажимали клавишу с клавиатуры.Иногда он вызывается и захватывает сообщение WM_KEYUP внутри процедуры обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...