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.