Gancho do teclado de baixo nível e pressionamentos de tecla de rawinput

Atualmente, estou fazendo um programa que intercepta as teclas digitadas de um teclado específico (filtrado usando o HID). Então, para saber quais teclas foram enviadas por um dispositivo específico, usei a técnica RawInput, inspirada por este ótimo tutorial:

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

Agora, funciona muito bem: posso obter um pressionamento de tecla e saber qual teclado o gerou.

A parte difícil do meu projeto é interceptar e bloquear as teclas desse teclado específico, para evitar que essas teclas atinjam o aplicativo focalizado (o foco significa a janela de primeiro plano trazida pelo SO).

Portanto, a solução natural era um gancho global de baixo nível, em todos os segmentos atuais que possuem um identificador de janela.

Eu usei e adaptei o código desta página para fazer isso:

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

Eu criei um novo projeto no visual studio para evitar colocar a bagunça no meu trabalho. Após algumas pesquisas, consegui bloquear as teclas digitadas em todos os aplicativos, retornando o valor (-1) na função de retorno de chamada:

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 colocar todos juntos (o procedimento de gancho e a detecção de pressionamento de tecla), eu crio dois segmentos no projeto final:

 : usando RawInput para identificar e anexar cada pressionamento de tecla a um dispositivo

 : usado para ligar todas as janelas e bloquear certas teclas

O encadeamento 1 é projetado para enviar pressionamentos de tecla para bloquear o encadeamento 2, que lê todas as mensagens enviadas para todos os aplicativos de janela e pressionamentos de tecla de lixo de um teclado específico. Preciso que esses dois segmentos estejam sincronizados.

O problema é que o hook parece ser executado antes da execução do Rawinput, então não consigo identificar o teclado que enviou o pressionamento de tecla. Eu não tenho idéia de como fazer isso, talvez para alterar o tipo de gancho (evite usar o gancho de teclado de baixo nível, mas usando um gancho de teclado de nível de espaço do usuário).

Ou talvez alguém saiba uma maneira inteligente de fazer o que eu quero?

Eu sei que este pedido é realmente complicado, não hesite em pedir mais detalhes.

questionAnswers(3)

yourAnswerToTheQuestion