begin process at 2012 02 11 12:58:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.NET

 > MESSAGEFILTER - FERMETURE FORM PAR ECHAP

MESSAGEFILTER - FERMETURE FORM PAR ECHAP


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :9 128 / 381

Auteur : coq

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) COQTEXTTOOLS : TRANSFORMATIONS TEXTE SIMPLE ET UTILISATION A...
Source avec Zip Source .NET (Dotnet) XPATH : UTILISEZ DES REQUÊTES PARAMÉTRÉES
Source avec Zip Source .NET (Dotnet) PORTÉE DE LA VALEUR D'UN CHAMP STATIC
Source avec Zip Source .NET (Dotnet) PINVOKE DYNAMIQUE
Source avec Zip Source .NET (Dotnet) MANIPULATION DE LA CORBEILLE (SUPPRESSION, INFORMATIONS, VID...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONBANQUE par toutphp
Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONAPPLICATION par toutphp
Source avec Zip SOCKET CONNEXION CLIENT & SERVEUR par ziedto83
Source avec Zip Source .NET (Dotnet) FFMPEG.NET : WRAPPER .NET DE FFMPEG par MasterShadows
Source avec Zip Source .NET (Dotnet) ATTACHER, CRÉER ET SAUVEGARDER UNE BASE DE DONNÉES SQL SERVE... par Alvepinai

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) APPLICATION NE POUVANT ÊTRE LANCÉ QU'UNE SEULE FOIS par LUDINSKI
Source avec Zip Source avec une capture Source .NET (Dotnet) IMESSAGEFILTER : ÉVÉNEMENTS MOUSEMOVE / MOUSEENTER / MOUSELE... par coq
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE PERMETTANT DE DÉPLACER UN CONTRÔLE SUR UN FORMULAIRE ... par LUDINSKI
Source .NET (Dotnet) IMESSAGEFILTER - EXEMPLE D'UTILISATION D'UN FILTRE DE MESSAG... par coq

Commentaires et avis

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 :<

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 :(

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 =)

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.

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;
}

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales