Процедура обратного вызова хук клавиатуры не вызывается непрерывно для 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 внутри процедуры обратного вызова.