Wie Sie wissen: C# ist eine Begleitsprache zur .NET Framework-Plattform, und es ist nicht möglich, globale Hooks mit eigenen Bibliotheken und Compiler-Provisionen zu implementieren. In der Praxis gelten jedoch Aufrufe zu unmanaged Code in C#, wobei die DllImport-Eigenschaft verwendet wird, um Methoden in der unmanaged Code-Bibliothek zu referenzieren. Hook-Funktionen existieren in user32.dll, und der Funktionsprototyp sieht wie folgt aus:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in BEISPIEL hMod,
__in DWORD dwThreadId);
Es kann verwendet werden, um eine bestimmte Art von Nachrichtenabfangverfahren mit dem Betriebssystem (Windows) zu registrieren, zum Beispiel können wir einen Hook registrieren, um globale Tastaturnachrichten zu blockieren, sodass alle Tastendruck- und Lift-Ereignisse von uns wahrgenommen und verarbeitet werden können (es ist nicht ausgeschlossen, dass es einen Frontend-Hook gibt, um die Nachricht abzuwerfen).
Wir können diese Funktion in C# referenzieren, indem wir sie folgendermaßen deklarieren:
[DllImport("user32.dll")] öffentliche statische externe int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Es ist erwähnenswert, dass die oben genannten HookType und HookProc meine benutzerdefinierten Typen sind, was nicht wichtig ist (weil das Programm beim Ausführen eine Speicheradresse übergibt), aber es muss bestimmte Spezifikationen erfüllen.
Die Parameter der Funktion von oben nach unten sind:
idHook-Typ, der hier durch ein geformtes Enum dargestellt wird LPFN-Rückruffunktion, wenn Hooks ins Spiel kommen hInstance-Modulhandle der Anwendungsinstanz (meist der Modulhandle der Anwendungsinstanz, in der sich Ihre Hook-Callback-Funktion befindet) threadIdDie Identifikatorin des Threads, der mit der installierten Hook-Unterroutine verknüpft ist
Es gibt verschiedene Arten von Hooks:
Wir verwenden in der Regel 13, um Tastaturnachrichten zu blockieren, und 14, um Mausmeldungen zu blockieren.
Die Deklaration der Callback-Funktion Wir müssen Delegierte in C# verwenden, und die Deklaration lautet wie folgt: öffentlicher Delegierter int HookProc (int nCode, int wParam, IntPtr lParam);
Der Top-down-Parameter bedeutet, dass der von der nCode-Hook-Kette zurückgegebene Parameter gegeben wird, 0 bedeutet, dass diese Nachricht (durch den vorherigen Hook) verworfen wird, und nicht-0 bedeutet, dass diese Nachricht weiterhin gültig bleibt
wParam-Nachrichtenparameter
lParam-Nachrichtenparameter
Es ist erwähnenswert, dass wParam und lParam verschiedene Arten unterschiedlicher Nachrichtentypen sind, aber die Typen von wParam können grob durch folgende Aufzählung dargestellt werden:
lParam wird im Allgemeinen als Struktur gekapselt, die je nach Art der Nachricht variiert; die folgenden beiden Strukturen sind die lParam-Struktur aus Maus- und Tastaturnachrichten:
Wenn wir die oben genannten Informationen verstehen, haben wir ein grundlegendes Verständnis der C#-Implementierung von Hook-Funktionen und achten dann auf einige Fragen:
1. Hooks benötigen viele Ressourcen und sollten rechtzeitig abgebrochen werden, wenn sie nicht verwendet werden, was die UnhookWindowsHookEx-Funktion erfordert
2. Aus Höflichkeit sollte der Hook das Verarbeitungsergebnis des nächsten Hakens zurückgeben, nicht nur das Verarbeitungsergebnis des aktuellen Hakens allein (verwenden Sie CallNextHookEx, um den nächsten Hook aufzurufen, da der Hook zuerst gesetzt wird und dann in Kraft tritt, sodass dies geschieht, um die normale Lieferung der Hakenkette sicherzustellen).
3. Der hInstance im Parameter der Hook-Funktion ist nur dort, wo sich die Callback-Funktion des aktuellen Hooks befindet, und die korrekte Adresse muss angegeben sein
4. Da der Delegierte verwendet wird, sollte sichergestellt werden, dass die Speicheradresse des Delegierten (Verweis auf die Methode) nicht gestört wird, andernfalls gibt es eine Ausnahme, wenn der Hook ausgeführt wird
Du kannst das Beispielprogramm herunterladen, das ich geschrieben habe, aber mein Programm benötigt folgende Hauptpunkte:
1. Ich habe die Implementierung von Hooks blockiert und nur die Nachrichtenabfangung und -verarbeitung von Tastatur und Maus geöffnet (die Nutzungsmethode ist dieselbe wie bei den WinForm-Maus- und Tastaturereignissen in C#), und man kann auch andere öffnen
2. Ich habe den Hook so entworfen, dass er im Singleton-Modus ist, du kannst ihn abbrechen
3. Aufgrund bestimmter Eindringlinge in das Betriebssystem kann Antivirensoftware als riskant gemeldet werden
4. Der Code ist schlecht geschrieben, mach dich damit zufrieden......
Schließlich besteht der Unterschied zwischen Programmiertechnologie und -sprache darin, dass ihre Compiler und Nutzer unterschiedlich sind, Menschen, die C verwenden, nicht als höher als diejenigen mit Java bezeichnet werden können, und Technologie sich nicht unbedingt in Pointern, Matrizen, Datenstrukturen widerspiegelt, solange Menschen Computerprinzipien, Kompilierungsprinzipien, Betriebssystemprinzipien usw. verstehen. Natürlich ist es gut, dass jeder seine eigene Lieblingssprache und übliche Programmiermethoden hat.
|