C++ 原始输入一个替代键盘钩子?

C++ 原始输入一个替代键盘钩子?,c++,winapi,input,keyboard,hook,C++,Winapi,Input,Keyboard,Hook,快速提问-- 我在读关于键盘挂钩的书,有人建议使用原始输入来实现这一点,但我还没有找到任何这样的例子。 例如,我正在使用 RAWINPUTDEVICE rid[1]; rid[0].usUsagePage = 0x01; rid[0].usUsage = 0x06; rid[0].hwndTarget = hWnd; rid[0].dwFlags = 0; RegisterRawInputDevices(rid, 1, sizeof(rid[0])); 在应用程序自己的窗口中捕捉WM_输入,但

快速提问--

我在读关于键盘挂钩的书,有人建议使用原始输入来实现这一点,但我还没有找到任何这样的例子。 例如,我正在使用

RAWINPUTDEVICE rid[1];
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x06;
rid[0].hwndTarget = hWnd;
rid[0].dwFlags = 0;
RegisterRawInputDevices(rid, 1, sizeof(rid[0]));
在应用程序自己的窗口中捕捉WM_输入,但不在应用程序之外。这在应用程序之外是可能的,还是必须使用WHU键盘或WHU键盘?MSDN没有明确说明是否可以在全球范围内进行原始输入

编辑:我知道挂钩,但我想知道你是否也可以用原始输入来做


Cheers

对于原始输入并不确切,但对于键盘钩子,通常需要将其设置为dll并在系统中注册,以便每个进程都能加载它。备注中的一些详细信息Windows钩子是一种机制,可用于在事件到达应用程序之前拦截事件。过滤函数(接收事件的函数)根据事件类型进行分类。如果要连接到Windows挂钩,则必须使用
SetWindowsHookEx
安装过滤功能。我必须提到,全局钩子必须在一个单独的dll文件中。您可以在中阅读有关钩子的更多信息。

查看,有一个名为
RIDEV\u INPUTSINK
的标志,该标志描述为:“如果设置,则即使调用者不在前台,调用者也可以接收输入。”


我自己也没有弄糟过,但听起来它可能对从应用程序窗口之外获取输入有用。

这就是我初始化
原始输入的方式,以全局截获鼠标和键盘事件。与钩子相比,最大的优点是不需要DLL。
使用
WM\u input
处理窗口过程中的原始输入事件。欲了解更多信息:

#包括
const USHORT HID_鼠标=2;
const USHORT HID_键盘=6;
bool HID\u注册设备(HWND hTarget,USHORT用法)
{
rawinputhid装置;
hid.usussagepage=1;
hid.usUsage=用法;
hid.dwFlags=RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
hid.hwndTarget=hTarget;
return!!registerarWinputDevices(&hid,1,sizeof(RAWINPUTDEVICE));
}
作废HID_注销设备(USHORT使用)
{
rawinputhid装置;
hid.usussagepage=1;
hid.usUsage=用法;
hid.dwFlags=RIDEV_REMOVE;
hid.hwndTarget=NULL;
注册表rRawInputDevices(&hid,1,sizeof(RAWINPUTDEVICE));
}
int-WINAPI-WinMain(HINSTANCE-HINSTANCE、HINSTANCE、LPSTR命令行、int命令行)
{
WNDCLASS wc;
...
注册类(&wc);
HWND HWND=CreateWindow(…);
...
HID_注册表设备(hwnd,HID_键盘);
HID_注册表设备(hwnd,HID_鼠标);
味精;
while(GetMessage(&msg,NULL,0,0))
{
...
}
HID_注销设备(HID_鼠标);
HID_注销设备(HID_键盘);
返回(int)msg.wParam;
}

我说的是原始输入,而不是HooksUnderstood,特别是在您编辑了一个问题之后:)我认为原始输入消息仅在您的应用程序中可用,而不是全局可用。如果您想全局筛选消息,我认为您必须使用挂钩…实际上,您可以使用RIDEV\u INPUTSINK接收所有键盘输入,而不考虑焦点。
WH\u-keyboard
WH\u-keyboard
都不需要放置在DLL中。此外,问题是询问原始输入,原始输入可以监视系统范围的输入事件。@KaiserJohaan认为这是公认的最佳答案,因为它是您问题的正确解决方案。我已经多次使用过它。
#include <Windows.h>

const USHORT HID_MOUSE    = 2;
const USHORT HID_KEYBOARD = 6;

bool HID_RegisterDevice(HWND hTarget, USHORT usage)
{
    RAWINPUTDEVICE hid;
    hid.usUsagePage = 1;
    hid.usUsage = usage;
    hid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
    hid.hwndTarget = hTarget;

    return !!RegisterRawInputDevices(&hid, 1, sizeof(RAWINPUTDEVICE));
}

void HID_UnregisterDevice(USHORT usage)
{
    RAWINPUTDEVICE hid;
    hid.usUsagePage = 1;
    hid.usUsage = usage;
    hid.dwFlags = RIDEV_REMOVE;
    hid.hwndTarget = NULL;

    RegisterRawInputDevices(&hid, 1, sizeof(RAWINPUTDEVICE));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    WNDCLASS wc;
    ...
    RegisterClass(&wc);

    HWND hwnd = CreateWindow(...);
    ...

    HID_RegisterDevice(hwnd, HID_KEYBOARD);
    HID_RegisterDevice(hwnd, HID_MOUSE);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        ...
    }

    HID_UnregisterDevice(HID_MOUSE);
    HID_UnregisterDevice(HID_KEYBOARD);

    return (int) msg.wParam;
}