2011-01-18 3 views
5

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

Я читал о клавиатурных крючках, и один предложил использовать 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: Я знаю о крючках, но я хочу знать, можете ли вы сделать это с использованием сырого ввода!

Приветствия

ответ

0

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

+0

Я говорю о Raw Input, а не о крючках – KaiserJohaan

+2

Понял, особенно после того, как вы редактировали вопрос :) Я думаю, что исходные входные сообщения доступны только в вашем приложении, а не во всем мире. Если вы хотите фильтровать сообщения по всему миру, я думаю, вам придется использовать крючки ... – Vladimir

+0

Хорошо, спасибо, спасибо – KaiserJohaan

-1

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

+0

Ни 'WH_KEYBOARD' ни' WH_KEYBOARD_LL' нужно поместить в DLL. Кроме того, вопрос задает вопрос о Raw Input, а Raw Input может отслеживать входные события всей системы. – IInspectable

7

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

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

+0

Да и хорошо работает :) –

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; 
} 
Смежные вопросы