对于Windows X64位系统上的VC ++ X64位应用程序,不会连续调用键盘挂钩回调过程。
在64位应用程序中使用SetWindowsHookEx API正确设置了鼠标和消息挂钩。
仅对于无法正常使用的键盘挂钩而言,要在API下设置键盘挂钩,以对其进行设置并调用回调过程,即KeyBoardHookProc。
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);
}
预期结果: 设置键盘挂钩后,每当按下键盘上的按键并在回调过程中捕获WM_KEYDOWN或WM_SYKEYDOWN消息时,必须连续调用KeyHookProc。
实际结果: 设置键盘挂钩之后,每当我们从键盘上按下按键时,就不会连续调用KeyHookProc。有时它会被调用并在回调过程中捕获WM_KEYUP消息。