Hook global (system-wide hook) - blocage de touches

Description

EDIT : la fiche "How to set a Windows hook in Visual C# .NET" (http://support.microsoft.com/kb/318804/en-us) a été mise à jour

Global hooks are not supported in the .NET Framework
Except for the WH_KEYBOARD_LL low-level hook and the WH_MOUSE_LL low-level hook, you cannot implement global hooks in the Microsoft .NET Framework. To install a global hook, a hook must have a native DLL export to inject itself in another process that requires a valid, consistent function to call into. This behavior requires a DLL export. The .NET Framework does not support DLL exports. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically.

Low-level hook procedures are called on the thread that installed the hook. Low-level hooks do not require that the hook procedure be implemented in a DLL.

Concernant les WH_*_LL (NT4 SP3 minimum), je vous invite à jeter un oeil à cet article : http://www.codeproject.com/csharp/globalhook.asp

La solution comprend le projet d'une dll C++ (eh vi j'avais pas le choix) :
"Global Hook Is Not Supported in .NET Framework
You cannot implement global hooks in Microsoft .NET Framework. To install a global hook, a hook must have a native dynamic-link library (DLL) export to inject itself in another process that requires a valid, consistent function to call into. This requires a DLL export, which .NET Framework does not support. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically."

Il faut donc une petite dll, et pas nos chères MSIL :( .
Cependant le hook présenté ici n'est pas ce que je qualifierais de "complet".
En effet le traitement des messages (blocage ou non) est effectué dans le code C++.
Il s'agit donc pour cet exemple de simplement montrer comment faire pour l'utiliser dans notre code C#.

Le code présenté permet donc de lancer un blocage des touches :
- "windows" (celles qui ouvrent/ferment le menu démarrer)
- ctrl+echap (même chose que les touches win)
- alt+tab
- alt+echap (alt+tab-like)

Associé à :
- désactivation du Gestionnaire des taches (a regler via l'execution de gpedit.msc, il y a un reglage pour ctrl+alt+suppr)
- appli en plein ecran
- desactivation de la reduction et du changement de taille (le FormBorder sur None est pas mal dans son genre :) )
- gestion de l'event Closing (mot de passe pour que l'admin puisse quitter mais pas l'utilisateur ?)

=> L'utilisateur est bloqué sur notre appli.

Sous reserve du fait que je n'ai oublier aucune combinaison de touches naturellement... (il y a des raccourcis pour agrandir/reduire ??)

NOTE : le ctrl+alt+suppr n'est apparemment pas desactivable par un hook (sur XP du moins) : le systeme doit probablement se servir en premier ( egoiste !!! ^^ )
donc il faut faire la manip donnée plus haut
ce qui pose encore un probleme : Windows juge bon de dire a l'utilisateur qu'il n'a pas le droit de s'en servir ... par une boite de dialogue ... qui ramene la barre des taches au premier plan :(
d'où l'ajout la désactivation de la barre des taches (ce devrait etre faisable dans le code C# ça mais bon tant que j'étais dans le C++ je l'ai mit dedans ^^ )
donc elle apparait mais ne peut pas recevoir de clics.

Source / Exemple :


Voir zip, tout se passe dans le checkBox_CheckedChanged et les DllImport sont juste au dessus.

Conclusion :


Si il vous vient l'idée saugrenue de quitter l'appli de test par une fin de processus (ou si elle plante, je n'ai rien gerer dedans ^^) sans avoir decocher la case auparavant (ce qui desinstalle les blocages) : les blocages de touches sont enlevés mais la barre des taches est toujours inactive.
Il suffira de relancer l'appli, cocher la case et quitter l'appli normalement (le Close appelle la desinstallation du Hook et donc reactive la bdt)
Un bon reboot fera aussi l'affaire mais c'est plus long :)

REFERENCES :

HOW TO: Set a Windows Hook in Visual C# .NET
http://support.microsoft.com/?kbid=318804

Disabling Keys in Windows XP with TrapKeys (C++, mais sa desactivation du ctrl+alt+suppr marche pas chez moi)
http://msdn.microsoft.com/en-us/magazine/cc188951.aspx

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.