Niski poziom haka na klawiaturze i naciśnięcia klawiszy z rawinput

Obecnie tworzę program, który przechwytuje naciśnięcia klawiszy z określonej klawiatury (filtrowanej przy użyciu HID). Aby wiedzieć, które naciśnięcia klawiszy zostały wysłane przez określone urządzenie, użyłem techniki RawInput, zainspirowanej tym wspaniałym samouczkiem:

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

Teraz działa świetnie: mogę uzyskać naciśnięcie klawisza i wiedzieć, która klawiatura go wygenerowała.

Trudną częścią mojego projektu jest przechwytywanie i blokowanie naciśnięć klawiszy z tej konkretnej klawiatury, aby uniknąć tych naciśnięć klawiszy, aby dotrzeć do skoncentrowanej aplikacji (skupienie oznacza okno pierwszego planu przyniesione przez system operacyjny).

Zatem naturalnym rozwiązaniem był globalny hak niskiego poziomu na wszystkich bieżących wątkach, które mają uchwyt okna.

Użyłem i dostosowałem kod z tej strony, aby to zrobić:

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

Stworzyłem nowy projekt w studio wizualnym, aby uniknąć bałaganu w mojej pracy. Po kilku badaniach udało mi się zablokować naciśnięcia klawiszy we wszystkich aplikacjach, zwracając wartość (-1) w funkcji wywołania zwrotnego:

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

Aby połączyć całość (procedura haczyka i wykrywanie naciśnięć klawiszy), tworzę dwa wątki w końcowym projekcie:

1. : użycie RawInput do identyfikacji i dołączenia każdego naciśnięcia klawisza do urządzenia

2. : używane do zaczepiania wszystkich okien i blokowania naciśnięć klawiszy

Wątek 1 jest przeznaczony do wysyłania naciśnięcia klawisza, aby zablokować go w wątku 2, który odczytuje wszystkie wiadomości wysłane do wszystkich aplikacji okna i usuwa naciśnięcia klawiszy z określonej klawiatury. Dokładnie stwierdzam, że te dwa wątki są zsynchronizowane.

Problem polega na tym, że hak wydaje się być wykonywany przed wykonaniem Rawinput, więc nie mogę zidentyfikować klawiatury, która wysłała naciśnięcie klawisza. Nie mam pojęcia, jak to zrobić, może zmienić typ haczyka (unikaj używania haka klawiatury niskiego poziomu, ale używając haka klawiatury na poziomie użytkownika).

A może ktoś zna sprytny sposób na robienie tego, co chcę?

Wiem, że ta prośba jest naprawdę skomplikowana, nie wahaj się zapytać o więcej szczegółów.

questionAnswers(3)

yourAnswerToTheQuestion