Rodemery
Messages postés4Date d'inscriptionlundi 15 octobre 2001StatutMembreDernière intervention 5 juillet 2008
-
5 juil. 2008 à 02:30
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 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.
Rodemery
Messages postés4Date d'inscriptionlundi 15 octobre 2001StatutMembreDerniè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);
}
}
// 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
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.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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...