Teclado de bajo nivel y pulsaciones de teclas desde rawinput

Actualmente, estoy creando un programa que intercepta las pulsaciones de un teclado específico (filtrado utilizando su HID). Entonces, para saber qué pulsaciones de teclado ha enviado un dispositivo específico, utilicé la técnica RawInput, inspirada en este gran tutorial:

http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

Ahora funciona muy bien: puedo hacer una pulsación de tecla y saber qué teclado lo ha generado.

La parte difícil de mi proyecto es interceptar y bloquear las pulsaciones de este teclado específico, para evitar que estas pulsaciones alcancen la aplicación enfocada (enfocada significa la ventana de primer plano que trae el sistema operativo).

Así que la solución natural era un gancho global de bajo nivel, en todos los subprocesos actuales que tienen un identificador de ventana.

Usé y adapté el código de esta página para hacer eso:

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

Creé un nuevo proyecto en Visual Studio para evitar poner el desorden en mi trabajo. Después de algunas investigaciones, pude bloquear las pulsaciones en todas las aplicaciones, devolviendo el valor (-1) en la función de devolución de llamada:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)  
{
//Check if we have a key to pass

if (
    nCode >= 0 && ( 
    (wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP) ) 
    )
{
    int vkCode = Marshal.ReadInt32(lParam);
    if ((Keys)vkCode == Form1.KeysToIgnore)
    {
        return (IntPtr)(-1);
    }
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

Para poner todo junto (el procedimiento de enlace y la detección de pulsaciones de tecla), creo dos hilos en el proyecto final:

 : utilizar RawInput para identificar y adjuntar cada pulsación de tecla a un dispositivo

2do : se utiliza para enganchar todas las ventanas y bloquear ciertas pulsaciones de teclas

El subproceso 1 está diseñado para enviar pulsaciones para bloquear al subproceso 2, que lee todos los mensajes enviados a todas las aplicaciones de ventanas y trash pulsaciones de un teclado específico. Preciso que estos dos hilos están sincronizados.

El problema es que el enlace parece ejecutarse antes de la ejecución de Rawinput, por lo que no puedo identificar el teclado que envió la pulsación de tecla. No tengo idea de cómo hacerlo, tal vez para cambiar el tipo de enlace (evite usar el enlace de teclado de bajo nivel, pero use un enlace de teclado de nivel de espacio de usuario).

¿O tal vez alguien sabe una forma inteligente de hacer lo que quiero?

Sé que esta solicitud es realmente complicada, no dude en solicitar más detalles.

Respuestas a la pregunta(3)

Su respuesta a la pregunta