Windows X64位系统上的VC ++ X64位应用程序无法连续调用Keyboard Hook回调过程

时间:2019-05-23 14:19:16

标签: visual-c++ mfc

对于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消息。

0 个答案:

没有答案