【问题标题】:SetWindowsHookEx(WH_JOURNALRECORD, ..) sometimes hang the systemSetWindowsHookEx(WH_JOURNALRECORD, ..) 有时会挂起系统
【发布时间】:2015-06-02 19:22:49
【问题描述】:

我正在尝试升级旧应用程序以在 Windows 7 上运行,但我遇到了使用 Journal Hooks 的“宏录制”功能的问题。我已经完成了在 Windows 7 上进行这项工作所需的每一个步骤,即设置 uiAccess=true、签署 exe 并从 Program Files 目录运行它。

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

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

// 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 中安装挂钩导致挂起,我尝试将其移动到另一个线程但仍然挂起。

我做错了吗? 谢谢

【问题讨论】:

  • 我也看到了同样的情况。有没有想过这个?
  • @Drew Delano,很高兴看到我没有发疯,但遗憾的是我从未找到导致问题的原因。

标签: winapi windows-7


【解决方案1】:

JournalRecordProc callback function:

安装了 JournalRecordProc 挂钩程序的应用程序应注意 VK_CANCEL 虚拟键代码(在大多数键盘上实现为 CTRL+BREAK 组合键)。该虚拟键码应被应用程序解释为用户希望停止日志记录的信号。应用程序应通过结束记录序列并删除 JournalRecordProc 挂钩程序来响应。去除很重要。它通过挂在挂钩过程中来防止日志应用程序锁定系统。

【讨论】:

  • 是的,但我没有按 ctrl-break。它似乎在调用我的钩子之前挂起,而在 SetWindowsHookEx 函数中。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多