Interception globale des touches

Description

Bonjour,
Cette source est une amélioration/correction de la source de George Mamaladze : https://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

Ce dépôt fait suite à cette discussion :
http://codes-sources.commentcamarche.net/forum/affich-10076675-bloquer-les-touches-windows-atl-tab

Cette source permet d'intercepter les touches de manière générale quelque soit la fenêtre active.

Principales corrections/adaptation :
- Corrections par Whismeril pour permettre son utilisation et son déboggage
- Ajout du support de .NET4+ (problème avec une non rétrocompatibilité entre API)
- Ajout des modificateurs sur le KeyDown

Usage :
J'ai eu besoin de ce code pour bloquer les touches systèmes (Atl+Tab, Alt+F4, Windows).
Bien que l'exemple montre les touches Ctrl+Atl+Suppr, le système continue d'intercepter cette association quand même.

Classe de gestion :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;


namespace VotreProjet
{
    public sealed class LockWindowsKeys
    {

        private static LockWindowsKeys msInstance = null;

        public static void DisableWindowsKeys()
        {
            if (msInstance != null) return;
            msInstance = new LockWindowsKeys();
        }

        public static void EnableWindowsKeys()
        {
            if (msInstance == null) return;
            msInstance.Dispose();
            msInstance = null;
        }


        private LockWindowsKeys()
        {
            Gma.UserActivityMonitor.HookManager.KeyDown += HookManager_KeyDown;
        }

        private void HookManager_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.RWin:
                case Keys.LWin:
                case Keys.Apps:
                    e.Handled = true;
                    break;
                case Keys.F4:
                case Keys.Tab:
                    if ((e.Modifiers & Keys.Alt) != 0)
                        e.Handled = true;
                    break;
                case Keys.Escape:
                    if ((e.Modifiers & (Keys.Shift | Keys.Control)) != 0)
                        e.Handled = true;
                    break;
                case Keys.Delete:
                    if ((e.Modifiers & (Keys.Alt | Keys.Control)) != 0)
                        e.Handled = true;
                    break;
            }
        }


        private void Dispose()
        {
            try
            {
                Gma.UserActivityMonitor.HookManager.KeyDown -= HookManager_KeyDown;
            }
            catch (Exception ex )
            {
                //Problème lors de la libération
            }
        }

        ~LockWindowsKeys()
        {
            Dispose();
        }
    }
}

Pour activer l'interception des touches, il suffit d’appeler : LockWindowsKeys.DisableWindowsKeys()
Ne pas oublier d’appeler : LockWindowsKeys.EnableWindowsKeys() avant de quitter l'application.

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.