2

我正在尝试制作一个 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 参考不足以作为教程。有什么方法可以让我的应用程序能够从我的计算机上的任何地方捕获键盘输入?

提前感谢任何帮助/提示!

4

1 回答 1

2

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

不要使用全局挂钩,而是尝试使用原始输入。用于RegisterRawInputDevices()注册对键盘的兴趣,然后处理WM_INPUT击键消息。

于 2013-03-16T20:27:27.857 回答