Comment installer un vérou partiel sur clavier

Rodemery
Messages postés
4
Date d'inscription
lundi 15 octobre 2001
Statut
Membre
Dernière intervention
5 juillet 2008
- 5 juil. 2008 à 02:30
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
- 7 juil. 2008 à 10:07
Salut!

Je développe une application pour laquelle j'ai besoin de désactiver toutes les touches du clavier sauf les touches alphaNumériques et quelques touches système telles que le BackSpace, le Enter, le Suppr, les fleches avant et arrière.
J'arrive à installer le vérou partiel à l'aide des fonctions
SetWindowsHookEx, 
UnhookWindowsHookEx et CallNextHookEx de l'API windows
.
Mais comment capturer les touches que je laisse passer dans un contrôle de mon fomulaire (un textBox par exemple). La difficulté se situe au niveau du traitement des touches système (BackSpace, Suppr, ...).
Merci pour votre aide.

3 réponses

cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
5 juil. 2008 à 08:29
Salut,
Peut-être un début de réponse ici:
http://www.csharpfr.com/codes/DESACTIVATION-CLAVIER-SOURIS_39149.aspx

<hr />
-My Blog-
0
Rodemery
Messages postés
4
Date d'inscription
lundi 15 octobre 2001
Statut
Membre
Dernière intervention
5 juillet 2008

5 juil. 2008 à 10:44
salut Bidou!
J'ai jété un coup d'oeil à la ressource proposée. Le code établit bien un vérou mais le vérou est global. Ce que je veux, c'est une sorte de filtre qui bloque certaines touches et qui laisse passer  d'autres.
Voilà un aperçu de ce que j'obtiens actuellement (je me suis inspiré d'exemples trouvés sur  www.codeproject.com et aussi sur www.csharpfr.com )

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;


public class KeyboardHook : IDisposable
{
    // Constantes API
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private const int WM_SYSKEYUP = 0x0105;


    //Variables utilisées dans l'apel de SetWindowsHookEx
    private HookHandlerDelegate proc;
    private IntPtr hookID = IntPtr.Zero;
    internal delegate IntPtr HookHandlerDelegate(
        int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);


    // Structure retournée lorsqu'une touche est enfoncée
    internal struct KBDLLHOOKSTRUCT
    {
        public int vkCode;
        int scanCode;
        public int flags;
        int time;
        int dwExtraInfo;
    }




    /// Constructeur: Installation du vérou


    public KeyboardHook()
    {
        proc = new HookHandlerDelegate(HookCallback);
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            hookID = NativeMethods.SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                NativeMethods.GetModuleHandle(curModule.ModuleName), 0);
        }
    }




    /// Fonction de filtrage des touches du vérou


    private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
    {
        int AllowKey = 0;


        // Procède à la vérification uniquement lorsque la touche est relachée
        if (nCode >= 0)
        {            if ((wParam (IntPtr)WM_KEYUP) || (wParam (IntPtr)WM_SYSKEYUP))
            {
             if ((lParam.vkCode >= 48 && lParam.vkCode <= 90)) AllowKey = lParam.vkCode; //caracteres alphaNum
                if ((lParam.vkCode >= 96 && lParam.vkCode <= 105)) AllowKey = lParam.vkCode; //caracteres num des touches num                if (lParam.vkCode 8) AllowKey lParam.vkCode;   // Bkspce                if (lParam.vkCode 13) AllowKey lParam.vkCode;   // Enter                if (lParam.vkCode 16) AllowKey lParam.vkCode;   // Shift                if (lParam.vkCode 32) AllowKey lParam.vkCode;   // Space                if (lParam.vkCode 35) AllowKey lParam.vkCode;   // End                if (lParam.vkCode 36) AllowKey lParam.vkCode;   // Home                if (lParam.vkCode 37) AllowKey lParam.vkCode;   // Left                if (lParam.vkCode 39) AllowKey lParam.vkCode;   // Right                if (lParam.vkCode 45) AllowKey lParam.vkCode;   // Ins                if (lParam.vkCode 46) AllowKey lParam.vkCode;   // Del                if (lParam.vkCode 144) AllowKey lParam.vkCode;   // Num
            }


        }
        if (AllowKey == 0)
        {
            // Si la touche est interdite, rejette le msge
            return (System.IntPtr)1;
        }
        else
        {   // Si la touche est autorisée,
            Console.WriteLine(((Keys)AllowKey).ToString()); // Sortie deboguage          
           
            //Laisse passer le message.
            return NativeMethods.CallNextHookEx(hookID, nCode, wParam, ref lParam);
        }


    }




    /// Dévérouillage du clavier


    public void Dispose()
    {
        NativeMethods.UnhookWindowsHookEx(hookID);
    }


    // Importation des API Windows


    internal class NativeMethods
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetModuleHandle(string lpModuleName);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr SetWindowsHookEx(int idHook,
            HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool UnhookWindowsHookEx(IntPtr hhk);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);       
    }


}




J'arrive à afficher le nom de la touche dans la console (mais pas le caractère. j'obtient "BackSpace" au lieu de l'effet produit par la touche).
Je laisse passer le message vers les autres applications.
Ce que j'aimerais, c'est envoyer le message associé à la touche vers le formulaire (form1) de mon application et obtenir du formulaire qu'il le traite automatiquement c'est à dire qu'il affiche automatiquement le caractère dans le contrôle qui aura le focus.

Merci pour ton attention.
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
7 juil. 2008 à 10:07
Hello,
Sorry, pas eu de temps ce week end. J'ai une semaine chargée mais j'essayerai de jeter un coup d'oeil si j'ai un peu de temps. Dans le cas ou je trouverais qqch, je posterai...

<hr />
-My Blog-
0