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

Windows Forms Discussion :

Intercepter message prive d'une DLL C++


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut Intercepter message prive d'une DLL C++
    Bonjour

    Je suis newbie in C#

    J'ai une fonction developpée en C++ nommé sendMsg qui prend en parametre un handle de fenetre et renvoi un resultat en envoyant un POSTMESSAGE par le handle avec en paramete une BSTR dans le LPARAM

    j'ai besoin dans le cas d'une application d'intercepter le message et recuperer cette BSTR depuis une appli C# winForm.

    pour cela j'ai cree un nouveau projet avec un bouton qui va alors des l'appui appeler cette fonction et tenter de recuperer le message

    voila 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
     public partial class MainForm : Form
        {
            private const int WM_MSG = 0x0400; // valeur du message
            [DllImport("MsgDLL.dll")]
            public static extern bool SendMsg(IntPtr myhwnd);
            public MainForm()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                SendMsg(button1.Handle);
            }
     
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_MSG)
                {
                    string msg = m.LParam.ToString();
                    MessageBox.Show(msg);
                }
                base.WndProc(ref m);
            }
    malheureusement je ne recoit rien et je ne suit pas sur d'envoyer le bon handle

    mes questions : est ce que c'est la bonne facon de passer mon hande en le recuperant du bouton

    est ce la bonne facon d'intercepter un message en c#

    est ce la bonne maniere de convertir un LPARAM qui est une BSTR en string

    Cordialement

  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
    Par défaut
    salut

    tu devrais essayer : this.Handle plutot que button1.Handle

    parce que là, la fonction WndProc gère les evenements de la form et vu que tu envoies le Handle d'un bouton... ya forcément soucis

    The Monz, Toulouse

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Merci pour ta reponse.

    En passant le handle a this.handle

    Je ne recoit toujours pas le message.
    comment le debugger et comment on envoi un message a une form en c#

    cordialement

  4. #4
    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
    Par défaut
    en général, on utilise :

    API Win32 : SendMessage()

    Voir pinvoke.net pour le prototype

    The Monz, Toulouse

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    J'avance.

    Avec le postmessage du c# je recoit bien
    avec le postmessage du C++ (la DLL ) et un Lparam en int , je recoit bien.

    avec le postmessage du C++ avec le lparam en BSTR, je recoit pas.
    DOnc l'erreur est soit je peux pas envoyer un tel format du C++ au C#

    En C# quelle est le moyen d'envOyer et recuperer une string dans un LPARAM ou quell format je doit utiliser dans le LPARAM du C++ pour passer un string

    Cordialement

  6. #6
    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
    Par défaut
    j'sais pas, un truc du genre :

    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
     
     public partial class Form1 : Form
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void BtnSendMsg_Click(object sender, EventArgs e)
            {
                string message = "nicolas is good";
                Byte[] bytes = new Byte[message.Length];
                bytes = Encoding.ASCII.GetBytes(message);
                IntPtr data = Marshal.AllocCoTaskMem(message.Length);
                Marshal.Copy(bytes, 0, data, message.Length);            
                SendMessage(this.Handle, 0x400, data, (IntPtr)message.Length);
                Marshal.FreeCoTaskMem(data);
            }
     
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                if (m.Msg == 0x400)
                {
                    string result = Marshal.PtrToStringAnsi(m.WParam, (int)m.LParam);
                    MessageBox.Show("J'ai recu le message : " + result);
                }
            }
        }
    Genre ?

    The Monz, Toulouse

Discussions similaires

  1. Appel d'une methode de classe par message inopérant dans une dll
    Par Jacques Deyrieux dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/08/2010, 08h10
  2. Intercepter le plantage d'une DLL
    Par Cravis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/09/2008, 09h54
  3. afficher les messages printf depuis une dll
    Par keenan dans le forum C++
    Réponses: 2
    Dernier message: 16/01/2008, 09h22
  4. Creation d'un message dans une dll non MFC
    Par dug dans le forum Windows
    Réponses: 1
    Dernier message: 29/11/2005, 12h50
  5. Réponses: 4
    Dernier message: 02/10/2005, 13h01

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