2011-01-18 16 views
5

Pregunta rápida -Raw ¿Ingresa un gancho de teclado alternativo?

Estaba leyendo acerca de los ganchos del teclado y uno sugirió usar la Entrada sin procesar para hacer esto, pero no he encontrado ningún ejemplo de ello. Por ejemplo, yo estoy usando

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])); 

Y catchign WM_INPUT bien en las aplicaciones propia ventana, pero no fuera de la aplicación. ¿Es esto posible fuera de la aplicación o tienes que usar WH_KEYBOARD o WH_KEYBOARD_LL? MSDN no dejó en claro si Raw Input se podría hacer globalmente.

EDIT: Sé de Hooks, pero también quiero saber si puedes hacerlo con Raw.

Saludos

Respuesta

0

Un gancho de Windows es un mecanismo que se puede usar para interceptar eventos antes de que lleguen a una aplicación. Las funciones de filtro (funciones que reciben eventos) se clasifican de acuerdo con el tipo de evento. Si uno desea conectarse a un gancho de Windows, la función de filtro debe instalarse usando SetWindowsHookEx. Tengo que mencionar que los ganchos globales deben estar en un archivo dll separado. Puede leer más sobre los ganchos en MSDN.

+0

Estoy hablando de Entrada cruda, no ganchos – KaiserJohaan

+2

Entendido, especialmente después de haber editado una pregunta :) Creo que los mensajes de entrada sin procesar están disponibles solo en su aplicación, no globalmente. Si quiere filtrar mensajes globalmente, creo que tendrá que usar ganchos ... – Vladimir

+0

Ok, ya veo, gracias – KaiserJohaan

-1

no está seguro exactamente sobre la entrada bruta, pero para gancho de teclado, en general, lo que necesita para que sea un DLL y registrar en el sistema por lo que será cargado por cada proceso. algunos detalles here en observaciones

+0

Ni '' WH_KEYBOARD' ni WH_KEYBOARD_LL' que ser colocado en un archivo DLL. Además, la pregunta es acerca de Raw Input, y Raw Input puede monitorear eventos de entrada en todo el sistema. – IInspectable

7

En cuanto a the MSDN documentation for that stuff, hay una marca llamada RIDEV_INPUTSINK que se describe como: "Si se establece, esto permite que la persona que llama reciba la entrada incluso cuando la persona que llama no está en primer plano".

No me he equivocado con eso, pero parece que podría ser útil para obtener información desde más allá de la ventana de la aplicación.

+0

Sí y funciona bien :) –

1

Así es como inicializo RAW INPUT para interceptar globalmente eventos de mouse y teclado. La gran ventaja en comparación con los ganchos es que no necesita una DLL. Trata los eventos de entrada sin procesar en el procedimiento de ventana con WM_INPUT. Para más informaciones: 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; 
} 
Cuestiones relacionadas