c++ - Windows API全局钩子(Hook)的无限范围

标签 c++ winapi hook keyboard-events

我正在尝试制作一个 C++ 应用程序来处理 PC 上运行的每个应用程序上的键盘事件(实际上,只是想“捕获”用户键入的一些短语)。我想做的事情的基础是:

#define _WIN32_WINNT 0x0500

#include <iostream>
#include <windows.h>
using namespace std;

HHOOK hHook;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    printf("Activated\n"); 
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  MSG msg;
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

现在,这个是全局的,但是当我发现当我运行特定应用程序时它没有“听到”我的键盘输入时,我仍然陷入困境。根据我的发现,问题一定是所需的应用程序与我的应用程序不属于同一桌面(因为此回调函数对于我的应用程序的桌面来说是全局的)。我尝试实现一些桌面切换技巧,但我真的不熟悉 Windows API,我的所有努力很快就失败了。 MSDN 引用不足以作为教程。有什么方法可以让我的应用程序能够捕获计算机上任何地方的键盘输入?

预先感谢您的任何帮助/提示!

最佳答案

全局 Hook 必须在 DLL 中实现,以便它可以 Hook 到多个进程。如果要支持 64 位系统,则必须实现单独的 32 位和 64 位版本。 SetWindowsHookEx() 的文档说明了这一点。

不要使用全局钩子(Hook),而是尝试使用Raw Input。使用 RegisterRawInputDevices() 注册对键盘的兴趣,然后处理击键的 WM_INPUT 消息。

关于c++ - Windows API全局钩子(Hook)的无限范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15454042/

相关文章:

Android SREC_JNI编译错误

c++ - qt4 : call of update() on a single QGraphicsItem causes paint() on ALL QGraphicsItem

c++ - 如果与指针一起使用,dynamic_cast 何时会抛出异常?

c - 设置共享变量时应该使用临界区还是内存屏障?

c++ - 列表框通知

c++ - 挂接到特定线程时,SetWindowsHookEx 返回 null

c++ - std::vector 不会为多个 vector 条目创建 cv::Mat 的新引用 - 初始化矩阵时数据会被覆盖

c++ - 在 C++ 中每 10 毫秒执行一次函数

c++ - 如何以编程方式区分 subst 命令创建的虚拟驱动器和实际可移动驱动器

git - 运行预提交 Hook 后要暂存什么?