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

Soyez le premier à donner votre avis sur cette source.

Vue 22 883 fois - Téléchargée 1 254 fois

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

Ajouter un commentaire Commentaires
Messages postés
21
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
18 décembre 2008

bonjour,
qui peut svp m'envoyer le fichier dll du projet en Visual C.j'arrive à le compiler.

Merci.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Content que ça serve (même 5 ans après :-D)
Par contre c'est vrai que le code C++ n'est probablement pas parfait :-)
Messages postés
223
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
3 juin 2019
1
Super ça marche nikel

je rajoute
// blocage du alt+F4 (donc si on recoit KEYDOWN pour tab et que flags = LLKHF_ALTDOWN : (alt appuyée))
if ( params->vkCode == VK_F4 && params->flags & LLKHF_ALTDOWN)
return TRUE; // blocage du message

et maintenant j'ai une application complètement verrouillée

Coq t'es au poil ....
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Probablement un conflit avec des versions des headers différentes de celles utilisées à la publication de ce code (VS2003), cette structure doit proablement être maintenant définie dans un header inclu directement ou indirectement.
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Ca veut pas compiler, ca met l'erreur
error C2371: 'KBDLLHOOKSTRUCT' : redefinition; different basic types

sur
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

Comment faire? :(
Afficher les 10 commentaires

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.