Raw Input альтернативный хук клавиатуры? - PullRequest
5 голосов
/ 19 января 2011

Быстрый вопрос -

Я читал о клавиатурных хуках, и один из них предложил использовать 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 глобально.

РЕДАКТИРОВАТЬ: Я знаю о Крюках, но я хочу знать, если вы можете сделать это с помощью ввода Raw!

Приветствия

Ответы [ 4 ]

7 голосов
/ 19 января 2011

Глядя на документацию MSDN для этого материала , есть флаг под названием RIDEV_INPUTSINK, который описывается как: «Если установлено, это позволяет вызывающему получать входные данные, даже если вызывающий не находится в передний план. "

Я сам с этим не связывался, но, похоже, это может быть полезно для получения информации из окна приложения.

1 голос
/ 15 декабря 2016

Вот как я инициализирую 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;
}
0 голосов
/ 19 января 2011

Хук Windows - это механизм, который можно использовать для перехвата событий, прежде чем они достигнут приложения. Функции фильтра (функции, которые получают события) классифицируются в соответствии с типом события. Если кто-то хочет присоединиться к хуку Windows, необходимо установить функцию фильтра, используя SetWindowsHookEx. Я должен упомянуть, что глобальные хуки должны быть в отдельном файле DLL. Вы можете прочитать больше о хуках в MSDN .

0 голосов
/ 19 января 2011

точно не уверен насчет необработанного ввода, но для перехвата клавиатуры в целом вам нужно сделать его dll и зарегистрироваться в системе, чтобы он загружался каждым процессом.некоторые детали здесь в комментариях

...