我尝试升级旧应用程序以在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中安装钩子导致挂起,我试图将它移动到另一个线程但仍然挂起。
我做错了吗? 感谢
答案 0 :(得分:0)
JournalRecordProc callback function:
已安装 JournalRecordProc 挂钩程序的应用程序应该关注 VK_CANCEL 虚拟密钥代码(实现为CTRL + BREAK组合键)大多数键盘)。应用程序应将此虚拟键代码解释为用户希望停止日志记录的信号。应用程序应通过结束录制序列并删除 JournalRecordProc 挂钩过程来做出响应。去除很重要。它可以防止日记应用程序通过挂起钩子过程来锁定系统。