Lost in the matrix

C/C++/C#/Java, Multithreading

Voici une méthode pour envoyer un évènement "KeyPress" à un
contrôle C#. Elle ne nécessite pas d'avoir le "focus" sur
l'élément visé.
---------------------------------------------------------------
using System;
using System.Windows.Forms;
using System.Reflection;

namespace Test
{
public sealed class KeyEventSender
{
private KeyEventSender()
{
}

// WM_CHAR est définit dans l'API de windows
// notification d'un événement clavier
internal static readonly int WM_CHAR = 258;

public static void Send(Control control, char c)
{
Message m = new Message();
m.HWnd = (IntPtr)control.Handle; // "Handle" du contrôle.
m.Msg = KeyEventSender.WM_CHAR; // type de l'évènement windows
m.LParam = IntPtr.Zero; // pas d'option
m.WParam = (IntPtr)c; // valeur de caractère
// on récupère la définition de la méthode par réflexion
// car la méthode n'est pas publique
MethodInfo dynMethod = control.GetType().GetMethod("ProcessKeyEventArgs",
BindingFlags.NonPublic BindingFlags.Instance);
// on invoque la méthode.
dynMethod.Invoke(control, new object[] { m });
}

public static void Send(Control control, KeyPressEventArgs e)
{
KeyEventSender.Send(control, e.KeyChar);
}
}
}

0 commentaires:

Enregistrer un commentaire