Вопрос: Сырье Ввод альтернативного крючка клавиатуры?


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

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

И catchign WM_INPUT отлично в собственном окне приложений, но не вне приложения. Возможно ли это за пределами приложения или вам нужно использовать WH_KEYBOARD или WH_KEYBOARD_LL? MSDN не давала понять, может ли Raw Input быть сделан глобально.

EDIT: Я знаю о Hooks, но я хочу знать, можете ли вы сделать это с использованием Raw!

ура


5


источник


Ответы:


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


0



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

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


7



Вот как я инициализирую RAW INPUT глобально перехватывать события мыши и клавиатуры. Большое преимущество по сравнению с крючками - вам не нужна DLL. Вы обрабатываете необработанные входные события в процедуре окна с помощью WM_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;
}

1



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


0