Raw输入另一个键盘钩?

时间:2011-01-18 23:18:35

标签: c++ winapi input keyboard hook

快速提问 -

我正在阅读有关键盘钩子的信息,有人建议使用Raw Input执行此操作,但我找不到任何示例。 例如我正在使用

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_INPUT,但不在应用程序之外。这可能在应用程序之外,还是必须使用WH_KEYBOARD或WH_KEYBOARD_LL? MSDN没有说清楚Raw Input是否可以在全球范围内制作。

编辑:我知道Hooks,但我想知道你是否也可以使用Raw输入!

干杯

4 个答案:

答案 0 :(得分:7)

查看the MSDN documentation for that stuff,有一个名为RIDEV_INPUTSINK的标记,其描述为:“如果设置,则即使呼叫者不在前台,也可以使呼叫者接收输入。” / p>

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

答案 1 :(得分:1)

这是我初始化RAW INPUT以全局拦截鼠标和键盘事件的方法。与钩子相比的巨大优势是你不需要DLL。 您使用WM_INPUT处理窗口过程中的原始输入事件。有关更多信息:RAW INPUT

#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;
}

答案 2 :(得分:0)

不确定原始输入,但对于键盘钩子,一般你需要将它作为一个dll并在系统中注册,以便它将被每个进程加载。备注中的一些细节here

答案 3 :(得分:0)

Windows挂钩是一种可用于在事件到达应用程序之前拦截事件的机制。过滤功能(接收事件的功能)根据事件类型进行分类。如果想要附加到Windows挂钩,则必须使用SetWindowsHookEx安装过滤器功能。我必须提到全局钩子必须在一个单独的dll文件中。您可以在MSDN中了解有关挂钩的更多信息。