Low Level Keyboard Hook & Tastenanschläge von Rawinput

Momentan mache ich ein Programm, das Tastenanschläge von einer bestimmten Tastatur abfängt (gefiltert anhand des HID). Um herauszufinden, welche Tastenanschläge von einem bestimmten Gerät gesendet wurden, habe ich die RawInput-Technik verwendet, die von diesem großartigen Tutorial inspiriert wurde:

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

Jetzt funktioniert es super: Ich kann einen Tastendruck bekommen und weiß, welche Tastatur ihn erzeugt hat.

Der schwierige Teil meines Projekts ist es, Tastenanschläge von dieser speziellen Tastatur abzufangen und zu blockieren, um zu vermeiden, dass diese Tastenanschläge die fokussierte Anwendung erreichen (fokussiert bedeutet das Vordergrundfenster, das vom Betriebssystem gebracht wird).

Die natürliche Lösung war also ein globaler Hook auf niedriger Ebene für alle aktuellen Threads, die über ein Fensterhandle verfügen.

Ich habe den Code von dieser Seite benutzt und angepasst, um das zu tun:

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

Ich habe ein neues Projekt in Visual Studio erstellt, um das Chaos in meiner Arbeit zu vermeiden. Nach einigen Recherchen konnte ich Tastatureingaben in allen Anwendungen blockieren, indem ich den Wert (-1) in der Rückruffunktion zurückgab:

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

Um alles zusammenzufassen (Hook-Prozedur und Tastendruckerkennung), erstelle ich im endgültigen Projekt zwei Threads:

1 : Verwenden von RawInput zum Identifizieren und Anhängen jedes Tastenanschlags an ein Gerät

2nd : Dient zum Aufhängen aller Fenster und zum Blockieren bestimmter Tastenanschläge

Thread 1 sendet Tastatureingaben zum Blockieren an Thread 2, in denen alle an alle Fensteranwendungen gesendeten Nachrichten gelesen und Tastatureingaben von einer bestimmten Tastatur aus dem Papierkorb entfernt werden. Ich präzisiere, dass diese beiden Threads synchronisiert sind.

Das Problem ist, dass der Hook vor der Ausführung von Rawinput ausgeführt zu werden scheint, sodass ich die Tastatur, die den Tastenanschlag gesendet hat, nicht identifizieren kann. Ich habe keine Ahnung, wie ich das machen soll, vielleicht um die Art des Hakens zu ändern (vermeiden Sie die Verwendung eines Tastaturhakens auf niedriger Ebene, aber die Verwendung eines Tastaturhakens auf Benutzerbereichsebene).

Oder weiß vielleicht jemand einen geschickten Weg, um das zu tun, was ich will?

Ich weiß, dass diese Anfrage wirklich kompliziert ist, zögern Sie nicht, nach weiteren Details zu fragen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage