SetWindowsHookEx WH_JOURNALRECORD 阻止鼠标点击 + 击键

SetWindowsHookEx WH_JOURNALRECORD Blocks Mouse Clicks + Keystrokes

我正在尝试使用 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)。尽管是一个控制台应用程序,但我添加了一个消息循环,所以我认为这不是问题所在。

如果有人知道我做错了什么,或者我该如何解决这个问题,我们将不胜感激。

经过数小时的故障排除后,我注意到如果我在 Windows 上创建一个新用户帐户并从那里创建 运行,挂钩会按预期安装和 运行s。

我将所有 运行ning 进程和服务转储到我的新测试帐户以及我的主帐户上,并检查了那些只存在于我的主帐户上的进程和服务。

我找到了一项服务(Alienware Command Center),运行它是允许我自定义鼠标和键盘的软件的一部分。当服务和相应的进程被终止时,日志挂钩将按预期工作。

无论出于何种原因,该服务内部的某些内容都会干扰挂钩。