SetWindowsHookEx(WH_JOURNALRECORD,..)有时挂起系统

时间:2015-03-29 21:23:29

标签: winapi windows-7

我尝试升级旧应用程序以在Windows 7上运行,并且我在使用"宏录制"功能,使用Journal Hooks。我已经完成了在Windows 7上运行所需的每一步,即设置uiAccess = true,签署exe并从Program Files目录运行它。

它通常可以工作,但有时,由于没有明显的原因,似乎SetWindowsHookEx函数正在等待某些东西并以一种奇怪的方式挂起整个系统:没有输入发送到任何应用程序。我可以摆脱这个问题的唯一方法是执行ctrl-alt-del,强行卸载钩子。

我用一个简单的应用程序复制了这个问题。使用Visual Studio的默认生成的Win32模板,我修改了关于对话框回调以注册和取消注册钩子:

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    {
        // added this
        recordHook = ::SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordCallback, hInst, 0);
        return (INT_PTR)TRUE;
    }
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            // and this
            UnhookWindowsHookEx(recordHook);
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

我的钩子回调函数只是

LRESULT CALLBACK JournalRecordCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

而且,与较大的应用程序一样,有时候,SetWindowsHookEx调用会挂起。

有没有人经历过这个?我认为可能在MessageLoop中安装钩子导致挂起,我试图将它移动到另一个线程但仍然挂起。

我做错了吗? 感谢

1 个答案:

答案 0 :(得分:0)

JournalRecordProc callback function

  

已安装 JournalRecordProc 挂钩程序的应用程序应该关注 VK_CANCEL 虚拟密钥代码(实现为CTRL + BREAK组合键)大多数键盘)。应用程序应将此虚拟键代码解释为用户希望停止日志记录的信号。应用程序应通过结束录制序列并删除 JournalRecordProc 挂钩过程来做出响应。去除很重要。它可以防止日记应用程序通过挂起钩子过程来锁定系统。