Imessagefilter - exemple d'utilisation d'un filtre de messages

Contenu du snippet

Suite à question sur le forum (http://www.csharpfr.com/forum.v2.aspx?ID=524275), voici un petit exemple d'implémentation de l'interface IMessageFilter (System.Windows.Forms.IMessageFilter).
Dans cet exemple on s'en sert pour définir un event "TabPressed" afin d'être averti de l'appui sur TAB dont la cible est un formulaire donné ou un de ses enfants.

Source / Exemple :


public class TabMessageFilter : IMessageFilter
{
    #region Constantes

    private const int WM_KEYDOWN = 0x0100;
    private const int VK_TAB = 0x09;

    #endregion Constantes

    #region Constructeur

    /// <summary>
    /// Initialise une nouvelle instance de TabMessageFilter.
    /// </summary>
    /// <param name="form">Instance de Form à surveiller.</param>
    public TabMessageFilter(Form form)
    {
        this._form = form;

        // inscription à l'event qui nous permettra d'être averti 
        // de la destruction du formulaire surveillé
        this._form.Disposed += new EventHandler(_form_Disposed);
    }

    #endregion Constructeur

    #region Champs

    private Form _form; // formulaire a surveiller.

    #endregion Champs

    #region Event TabPressed

    public event EventHandler TabPressed;

    /// <summary>
    /// Déclenche l'évènement TabPressed.
    /// </summary>
    protected virtual void OnTabPressed()
    {
        if ( this.TabPressed != null )
        {
            this.TabPressed(this._form, new EventArgs());
        }
    }

    #endregion Event TabPressed

    #region Membres de IMessageFilter

    public bool PreFilterMessage(ref Message m)
    {
        if ( m.Msg == WM_KEYDOWN && m.WParam == (IntPtr)VK_TAB && IsFormOrChildControl(m.HWnd) )
        {
            // si le message est l'appui sur une touche et qu'il s'agit de TAB 
            // et que la cible est un handle d'une fenetre dont le formulaire 
            // surveillé est parent, on déclenche l'event
            this.OnTabPressed();
        }

        return false;
    }

    #endregion

    #region Méthodes utilitaires

    /// <summary>
    /// Permet de savoir si le handle est celui d'un parent de notre formulaire
    /// </summary>
    /// <param name="hWnd"></param>
    /// <returns></returns>
    private bool IsFormOrChildControl(IntPtr hWnd)
    {
        try
        {
            return  ( Control.FromHandle(hWnd).FindForm() == _form );
        }
        catch
        {
            return false;
        }
    }

    #endregion Méthodes utilitaires

    private void _form_Disposed(object sender, EventArgs e)
    {
        // auto-suppression du filtre de message
        try
        {
            Application.RemoveMessageFilter(this);
        }
        catch
        {
        }
    }
}

///
/// Exemple d'utilisation
/// 
TabMessageFilter filter = new TabMessageFilter(this);
filter.TabPressed += new EventHandler(filter_TabPressed);
Application.AddMessageFilter(filter);

...

private void filter_TabPressed(object sender, EventArgs e)
{
    MessageBox.Show("TAB !!!");
}

Conclusion :


Liens utiles :

MSDN - Interface IMessageFilter :
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.imessagefilter.aspx

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.