【发布时间】:2021-03-02 06:46:52
【问题描述】:
我正在尝试使用SetWindowsHookEx 安装WH_JOURNALRECORD:
#include <iostream>
#include <Windows.h>
LRESULT CALLBACK WndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
std::cout << "Hook called" << std::endl;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
HHOOK hook = SetWindowsHookEx(WH_JOURNALRECORD, WndProc, 0, 0);
if (hook != NULL)
{
std::cout << "Hooked WH_JOURNALRECORD" << std::endl;
}
else
{
DWORD dw = GetLastError();
std::cout << "Failed to install hook:" << "(Error: " << dw << ")" << std::endl;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
我的应用程序使用证书签名并以管理员身份在 C:\Program Files 下运行,这是 JournalRecord 挂钩 (/uiAccess=true) 所必需的。应用程序启动并且挂钩已成功安装,但是我从未收到来自 WndProc 函数的任何输出。我可以移动光标,但是在按下ctrl+alt+del 或另一个强制Windows 卸载JournalRecord 挂钩的组合键之前,我无法单击或键入任何内容。
根据文档,这种类型的钩子是一个全局钩子,可以在相同的应用程序上下文中运行(即,不需要 DLL,就像其他类型的钩子一样)。尽管是一个控制台应用程序,但我添加了一个消息循环,所以我不认为这是问题所在。
如果有人知道我做错了什么,或者我可以如何解决这个问题,我们将不胜感激。
【问题讨论】:
-
此挂钩需要 DLL。神奇的是它没有失败。
-
我记得用 DLL 进行过尝试,结果相同。如果遇到问题,我将使用 DLL 再次尝试并在此处发布我的代码。但是 MSDN 文档声明:“JournalRecordProc 挂钩过程不需要存在于动态链接库中。JournalRecordProc 挂钩过程可以存在于应用程序本身中。” docs.microsoft.com/en-us/previous-versions/windows/desktop/…
-
嗨,大部分时间代码对我来说都很好,但偶尔我可以重现这个问题。我会与内部工程师确认,如果有任何更新,请在此处回复。感谢您的理解。
-
@ZhuSong-MSFT 我也在 MSDN Q&A 论坛上发布了这个问题。另一位工程师也在研究这个问题。已经取得了一些进展,但仍然存在问题:docs.microsoft.com/en-us/answers/questions/167703/…。该钩子将在系统重新启动时起作用,但是一旦我开始启动应用程序,输入就会再次锁定。即使杀死应用程序也无济于事,直到我再次重新启动。