Comme vous le savez : C# est un langage compagnon de la plateforme .NET Framework, et il n’est pas possible d’implémenter des hooks globaux avec ses propres bibliothèques et dispositions de compilateur. Mais en pratique, les appels vers du code non géré sont vrais en C#, en utilisant la propriété DllImport pour référencer des méthodes dans la bibliothèque de code non gérée. Les fonctions crochet existent dans user32.dll, et le prototype de fonction est le suivant :
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId) ;
Il peut être utilisé pour enregistrer un type spécifique de méthode de traitement d’interception de messages auprès du système d’exploitation (Windows), par exemple, nous pouvons enregistrer un crochet pour bloquer les messages clavier globaux, afin que tous les événements de pression et de levée du clavier puissent être perçus et traités par nous (il n’est pas exclu qu’il existe un crochet front-end pour déposer le message).
Nous pouvons référencer cette fonction en C# en la déclarant ainsi :
[DllImport(« user32.dll »)] public static extern int SetWindowsHookEx( Type de crochet idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Il est important de mentionner que le HookType et le HookProc ci-dessus sont mes types personnalisés, ce qui n’est pas important (car le programme passe une adresse mémoire lors de l’exécution), mais il doit respecter certaines spécifications.
Les paramètres de la fonction de haut en bas sont :
type idHook, qui est ici représenté par un énum façonné Fonction de rappel LPFN lorsque les hooks entrent en jeu hInstance module handle de l’instance application (généralement le module handle de l’instance application où se trouve votre fonction hook callback) threadIdL’identifiant du thread associé à la sous-routine hook installée
Il existe plusieurs types d’hameçons :
Nous utilisons généralement 13 messages clavier et 14 pour bloquer les messages de souris.
La déclaration de la fonction de rappel Nous devons utiliser des délégués en C#, et la déclaration est la suivante : public delegate int HookProc(int nCode, int wParam, IntPtr lParam) ;
Le paramètre descendant signifie que le paramètre renvoyé par la chaîne de crochets nCode, 0 signifie que ce message (par le crochet précédent) est rejeté, et non-0 signifie que ce message reste valide
Paramètres du message wParam
Paramètre du message lParam
Il convient de mentionner que wParam et l’iParam sont des types différents de messages différents, mais les types de wParam peuvent être grossièrement représentés par l’énumération suivante :
L’iParam est généralement encapsulé sous forme de structure, ce qui varie selon le type de message ; les deux structures suivantes sont la structure de l’iParam des messages de souris et clavier :
Lorsque nous comprenons les informations ci-dessus, nous avons une compréhension de base de l’implémentation C# des fonctions hook, puis nous prêtons attention à quelques questions :
1. Les crochets consomment beaucoup de ressources et doivent être annulés à temps lorsqu’ils ne sont pas utilisés, ce qui nécessite l’utilisation de la fonction UnhookWindowsHookEx
2. Par courtoisie, l’hameçon doit renvoyer le résultat de traitement du prochain crochet, et non celui du crochet courant seul (utilisez CallNextHookEx pour appeler le prochain crochet, puisque l’hameçon est posé en premier puis prend effet, donc cela doit être fait pour assurer la livraison normale de la chaîne d’hameçon).
3. L’hInstance dans le paramètre de la fonction hook n’est que là où se trouve la fonction de rappel du hook courant, et l’adresse correcte doit être donnée
4. Parce que le délégué est utilisé, il faut s’assurer que l’adresse mémoire du délégué (référence à la méthode) ne sera pas détruite, sinon il y aura une exception lors de l’exécution du crochet
Vous pouvez télécharger le programme d’exemple que j’ai écrit, mais mon programme a besoin des points principaux suivants :
1. J’ai bloqué l’implémentation des hooks, et n’ai ouvert que l’interception des messages et le traitement du clavier et de la souris (la méthode d’utilisation est la même que celle des événements souris et clavier WinForm de C#), et vous pouvez en ouvrir d’autres
2. J’ai conçu le crochet en mode singleton, tu peux l’annuler
3. En raison d’une certaine intrusion dans le système d’exploitation, les logiciels antivirus peuvent être signalés comme risqués
4. Le code est mal écrit, il suffit de s’en contenter......
Enfin, la différence entre la technologie de programmation et le langage est que leurs compilateurs et leurs utilisateurs sont différents, on ne peut pas dire que les personnes qui utilisent du C sont supérieures à celles qui utilisent Java, et la technologie ne se reflète pas nécessairement dans les pointeurs, matrices, structures de données, tant que les personnes qui comprennent les principes informatiques, de compilation, de systèmes d’exploitation, etc. Bien sûr, c’est bien que chacun ait son propre langage préféré et ses méthodes de programmation habituelles.
|