【发布时间】: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,很高兴看到我没有发疯,但遗憾的是我从未找到导致问题的原因。