Soyez le premier à donner votre avis sur cette source.
Snippet vu 11 990 fois - Téléchargée 31 fois
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 !!!"); }
9 août 2005 à 02:05
10/10
22 août 2005 à 14:32
idem que Lutinore.
merci beaucoup pour cet exemple qui m'apprend beaucoup.
26 août 2005 à 00:13
3 oct. 2008 à 17:06
Il vaut mieux faire dans le destructeur d'une form "Application.RemoveMessageFilter(this);" quand dans le contructeur on fait "Application.AddMessageFilter(this);" ??
4 oct. 2008 à 12:09
Si par "destructeur" tu entends le gestionnaire d'évènement attaché à l'event Disposed, ou une surcharge de la méthode Dispose, ça revient au même que ce que j'ai fait.
Si par "destructeur" tu parles d'un finaliseur, je ne crois pas non : tu n'as aucun idée du moment où il sera appelé, et je ne suis pas certaines des effets de bord possibles d'un appel à RemoveMessageFilter avec un objet en cours de finalisation.
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.