Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MESSAGEFILTER - FERMETURE FORM PAR ECHAP


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : imessagefilter Niveau : Débutant Date de création : 09/04/2004 Date de mise à jour : 21/11/2005 17:53:58 Vu / téléchargé: 7 524 / 328

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note


Description

Suite a une question sur le forum, voici un exemple d'utilisation des MessageFilter pour fermer un form à l'appui sur echap.
 

Source

  • // le plus important : la classe implémentant IMessageFilter, le reste est dans le zip
  • public class EchapMessageFilter : IMessageFilter
  • {
  • // constructeur, on lui passe le form qui sera concerné par les actions
  • public EchapMessageFilter(Form form)
  • {
  • this.form = form;
  • }
  • private const int WM_KEYDOWN = 0x0100;
  • private Form form;
  • public bool PreFilterMessage(ref Message m)
  • {
  • // si le message est une pression sur touche et que la touche est echap
  • if ( m.Msg == WM_KEYDOWN && m.WParam == (IntPtr)Keys.Escape)
  • {
  • // si le message est destiné a notre form ou un controle qu'il contient, on le ferme
  • if ( m.HWnd == form.Handle || form.Contains(Control.FromHandle(m.HWnd)) == true )
  • {
  • MessageBox.Show("Echap pressé !\nLe controle qui avait le focus est : "+Control.FromHandle(m.HWnd).Name);
  • // fermeture du form
  • form.Close();
  • // blocage du message
  • return true;
  • }
  • }
  • // le message n'etait pas celui qu'on attendait, on le laisse passer
  • return false;
  • }
  • }
// le plus important : la classe implémentant IMessageFilter, le reste est dans le zip
public class EchapMessageFilter : IMessageFilter
{
	// constructeur, on lui passe le form qui sera concerné par les actions
	public EchapMessageFilter(Form form)
	{
		this.form = form;
	}

	private const int WM_KEYDOWN = 0x0100;
	private Form form;

	public bool PreFilterMessage(ref Message m)
	{
		// si le message est une pression sur touche et que la touche est echap
		if ( m.Msg == WM_KEYDOWN && m.WParam == (IntPtr)Keys.Escape)
		{
			// si le message est destiné a notre form ou un controle qu'il contient, on le ferme
			if ( m.HWnd == form.Handle || form.Contains(Control.FromHandle(m.HWnd)) == true )
			{
				MessageBox.Show("Echap pressé !\nLe controle qui avait le focus est : "+Control.FromHandle(m.HWnd).Name);
				
				// fermeture du form
				form.Close();

				// blocage du message
				return true;
			}
		}
		
		// le message n'etait pas celui qu'on attendait, on le laisse passer
		return false;
	}
}

Conclusion

Essayez d'appuyer sur echap en ayant le focus sur differents controles. (même le rtb2 dans le panel)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

21 novembre 2005 17:53:58 :
ajout des mots clés

Commentaires et avis

signaler à un administrateur
Commentaire de bubbathemaster le 13/05/2006 19:59:10

J'ai rajouté à ton projet une toolbar avec un combobox, et si je clique sur cette combobox, l'evenement "echap" n'est plus détecté :/
Comment remédier à ce problème ? Je pensais que les message windows n'étaient pas dépendant du control qui a le focus :<

signaler à un administrateur
Commentaire de coq le 13/05/2006 21:42:16 administrateur CS

Le problème vient du fait que le contrôle ComboBox fonctionne avec un contrôle Edit interne, et que c'est sur celui ci qu'est envoyé le message.
Hors la méthode Control.FromHandle n'est pas capable de déterminer ce contrôle Edit, d'où la non prise en charge du message :(

signaler à un administrateur
Commentaire de bubbathemaster le 13/05/2006 21:55:20

Remarque, j'ai dit combobox mais j'ai aussi testé avec une textbox dans une toolbar et le problème reste entier.
Je comptais résoudre le problème de mon application http://www.csdnpicviewer.info en passant par les messages windows (l'evenemnt mouse wheel n'est plus capté lorsque l'utilisateur clique sur la combobox), je crois que je me suis foutu le doigt dans l'oeil. N'y a t-il donc pas une solution?
Sinon, bravo pour cette source, c'est assez instructif =)

signaler à un administrateur
Commentaire de coq le 13/05/2006 23:33:02 administrateur CS

Oui, le problème est exactement le même.
Je pense que tu peux y arriver en utilisant directement les API Win.

signaler à un administrateur
Commentaire de coq le 13/05/2006 23:59:46 administrateur CS

Ceci devrait peut être t'aider (à améliorer) :

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);

private const int GW_OWNER = 4;

private bool IsForMe(IntPtr hwnd)
{
    bool ret = false;

    IntPtr owner = GetWindow(new HandleRef(this, hwnd), GW_OWNER);

    if (owner != IntPtr.Zero)
    {
        Control ctrl = Control.FromHandle(owner);

        if (ctrl != null)
            ret = this._form.Contains(ctrl);
        else
            ret = false;
    }
    else
        ret = false;

    return ret;
}

signaler à un administrateur
Commentaire de Ramulo le 11/10/2007 14:45:51

Vraiment nikel ce système, je ne connaissais pas les MessageFilter, c'est bien pratique !
Par contre j'ai pris le parti de ne pas faire une classe 'EchapMessageFilter' dédiée, mais plutot de faire implémenter l'interface directement à mon form, je trouve ca plus simple :

public class Form1 : System.Windows.Forms.Form, IMessageFilter

Merci pour l'astuce en tous cas !

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.