IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Intercepter messages windows en C#


Sujet :

C#

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Intercepter messages windows en C#
    Bonjour à tous,
    nouveau au C#, je travaille sur une application qui doit recevoir des messages windows et des paramètres associés à partir d'une DLL.

    j'ai cru comprendre qu'il fallait surcharger WndProc, est ce bien le cas ?
    quelqu'un aurait il un exemple de code pour cette partie ?

    Merci,
    Christophe

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    des exemples : Yen a plein sur le net

    Il faut surcharger 'overider' WndProc et ensuite comparer le message fourni à la valeur du message que tu veux traiter

    C'est pas plus compliqué que cela

    Sinon, tu peux aussi utiliser le MessageFilter de la classe Application (comme celà), t'es pas obligé de traiter les messages dans une Winform.

  3. #3
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci pour ta réponse,
    effectivement j'en suis là... mais le problème (que j'ai oublié de préciser !) c'est que je travaille sur un windows CE 6... avec .Net compact framework.

    aussi very newbee, je cherche un exemple tout fait pour me faire la main...
    si une âme sensible peut m'aider ;-)

    christophe

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327

  5. #5
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    plein le net oui ;-)
    je teste ce dernier exemple, merci.

    le code que je veux faire sur mon windows ce 6, est l'équivalent de ça sous XP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
     
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            protected override void WndProc(ref System.Windows.Forms.Mess  Message m)
            {
                Debug.WriteLine(m);
                base.WndProc(ref m);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
            }
        }
    }
    une simple form, qui intercepte et log les messages WM transitant.
    je vous tient au courant.

    Merci et encore désolé, je suis very newbee, (ou développeur Delphi à la dérive C#) ;-)

    Christophe

  6. #6
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Bon, j'ai le sentiment de ne pas être loin... mais ça marche pas.
    à partir de l'exemple donné par bacelar, j'essaie de faire ce petit programme en C# sur Win CE 6 qui tracera tous les messages windows transitant dans la fenêtre.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.WindowsCE.Forms;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
     
    namespace DEMOSPP3
    {
        public partial class MessageWindowForm : Form
        {
            // Create an instance of MsgWindow, a derived MessageWindow class.
            MsgWindow MsgWin;
     
            public MessageWindowForm()
            {
                InitializeComponent();
                // Create the message window using this form for its constructor.
                this.MsgWin = new MsgWindow(this);
            }
     
            // Process taps to generate messages
            // with the WParam and LParam parameters
            // using the X and Y mouse coordinates.
            protected override void OnMouseMove(MouseEventArgs e)
            {
                Message msg = Message.Create(MsgWin.Hwnd,
                 MsgWindow.WM_CUSTOMMSG,
                 (IntPtr)e.X,
                 (IntPtr)e.Y);
                MessageWindow.SendMessage(ref msg);
                base.OnMouseMove(e);
            }
     
            // This callback method responds to the Windows-based message.
            public void RespondToMessage(int x, int y)
            {
                this.Text = "X = " + x.ToString() + ", Y= " + y.ToString();
            }              
     
        }
     
        // Derive MessageWindow to respond to
        // Windows messages and to notify the
        // form when they are received.
        public class MsgWindow : MessageWindow
        {
            // Assign integers to messages.
            // Note that custom Window messages start at WM_USER = 0x400.
            public const int WM_USER = 0x400;
     
            public const int WM_CUSTOMMSG = 0x800;
     
            // Create an instance of the form.
            private MessageWindowForm msgform;
     
            // Save a reference to the form so it can
            // be notified when messages are received.
            public MsgWindow(MessageWindowForm msgform)
            {
                this.msgform = msgform;
            }
     
            // Override the default WndProc behavior to examine messages.
            protected override void WndProc(ref Message msg)
            {
                Debug.WriteLine(msg.Msg);
     
                switch (msg.Msg)
                {
                    // If message is of interest, invoke the method on the form that
                    // functions as a callback to perform actions in response to the message.
                    case WM_CUSTOMMSG:
                        this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);
                        Debug.WriteLine("WM_CUSTOMMSG !!!");
                        break;
                }
                // Call the base WndProc method
                // to process any messages not handled.
                base.WndProc(ref msg);
            }
        }
     
    }
    mon problème avec ce code est que je vois bien le WM_CUSTOMMSG passé, mais aucun autre ? par exemple le WM_LBUTTONDOWN...etc...
    je pensais que les autres messages seraient visibles avec le WndProc ?
    où est mon erreur ??

    merci pour toute aide.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327
    Par défaut
    Je crois que pour ce type de message, il faut être un plus intrusif dans les WinProc des contrôles.
    http://msdn.microsoft.com/fr-fr/libr...81(VS.80).aspx

  8. #8
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    merci bacelar.
    là ça se complique... sous-classement... je suis pas au point du tout, et j'ai l'impression de sombrer !

    ça paraissait si simple, en windows XP (mon 3ème message).

    pourquoi je partais sur exemple pour scanner tous les messages windows arrivant dans mon application Win CE 6 ?
    parce qu'ensuite je souhaite intercepter seulement des messages spécifiques d'une DLL de communication BlueTooth que l'application a chargé et utilise.

    il n'y a pas de méthode générique ? comme en environnement XP ?

    parce que là je vois pas comment m'en sortir ?

  9. #9
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Je reviens sur ce post, pour voir si qqun pourrait m'aider à faire un programme simple C# pour Win CE 6, pouvant intercepter tous les messages windows transitant sur la form, comme le code ci-dessous qui marche sur XP mais pas sur Win CE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
     
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            protected override void WndProc(ref Message m)
            {
                Debug.WriteLine(m);
                base.WndProc(ref m);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
            }
        }
    }
    Le Debug.WriteLine(m) trace tous les messages WM_MOUSEMOVE, WM_GET_TEXT...

    quelques idées ?

  10. #10
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Salut pour info,
    j'ai trouvé le code que je cherchais ici :
    http://www.sergeybogdanov.com/Samples/WindowHook.zip

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par KRis Voir le message
    Salut pour info,
    j'ai trouvé le code que je cherchais ici :
    http://www.sergeybogdanov.com/Samples/WindowHook.zip
    Ce code fonctionne bien pour les messages < 0x0400 , mais peut-on intercepter des messages provenant d'une autre application tournant sur le système d'exploitation (User defined windows message).

    Cas concret: une application intégrée au système d'exploitation qui à la réception d'un signal IR envoie des message à ma forme que je dois intercepter.

    J'ai l'impression d'avoir parcouru toutes les pages de Google. Si quelqu'un pouvait me donner une piste.
    Windows CE 6.0 R3 application en C#

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    En fait je profite de ce post pour demander si quelqu'un connait l’équivalent de tout cela en wpf ? (comme on hérite directement de window et non plus de window.forms.form)

    merci d'avance de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intercepter les messages windows
    Par schneed dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/12/2005, 14h12
  2. Interception des messages windows
    Par sunchai dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/08/2005, 10h31
  3. Intercepter un Message Windows ? Créer un Composant Grille !
    Par TOTO32 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/07/2004, 13h41
  4. Réponses: 2
    Dernier message: 06/04/2004, 08h39
  5. Interception Messages Windows
    Par tiramisu dans le forum MFC
    Réponses: 5
    Dernier message: 24/02/2004, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo