我正在尝试制作一个 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/