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 :

Envoi de message d'une appli vers une autre


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut Envoi de message d'une appli vers une autre
    Je cherche à réaliser un Launcher pour mon appli.
    Pour que mon appli puisse êtres lancée par le menu demarrer ou par d'autres applications.
    Dans le second cas les appli passent des paramètres.
    J'avais réalisé ça en utilisant le "MonAppli.exe PARAM1 PARAM2".
    Mais dans le cas ou mon appli est déjà lancé ça génère des conflits.

    Je suis donc en train de faire ça en créant un launcher.exe et un MonAppli.exe.
    Le premier utilisant le SendMessage et le second une boucle while GetMessage.

    Mais je ne comprends rien aux valeurs à donner au SendMessage pour des message propre à l'application et non système.

    Est-ce que quelqu'un a un bout de code ou un lien ou c'est bienb expliqué ?

    Par ailleurs où installer la boucle du GetMessage, vu que mon appli est constituée d'un Conteneur MDI ?


    Merci de m'éclairer, je nage !

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    j'ai une autre idée mais je ne sais pas si ca peut aider :

    dans launcher.exe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try {
            Process.Start("MonApli.exe");
            }
             catch (Exception) { /*...*/}
    je crois que c'est plus simple

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Un membre de la rédaction a apporté dans son blog une solution qui consiste à utiliser les mutex pour bloquer le lancement de plusieurs instances d'une même appli: http://blog.developpez.com/nico-pyri...-seule-instan/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Merci a tous les 2.
    Mais j'ai déjà implanté le blocage de lancement d'une seconde instance et ça fonctionne trés bien.
    Mais ce n'est pas seulement cela que je dois réaliser.
    1. Si MonAppli.exe est déjà lancé elle doit recevoir des paramètres,
    2. Si elle ne l'est pas, il faut la lancer.

    Alors j'ai écrit ça, mais je ne sais pas si j'envois les bonnes valeurs, en tout cas je ne vois rien arriver dans la boucle de reception de messages du conteneur MDI de MonAppli.exe.

    Coté launcher.exe voila ce que j'ai écrit :
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
        public class Program : ApplicationContext
        {
            #region déclaration Message
     
            public const int WM_DDE_REQUEST = 0x3E6;
     
            #endregion
     
            [DllImport("user32.dll")]
            public static extern int SendMessage(
                  IntPtr hWnd,      // handle to destination window
                  uint Msg,      // message
                  int wParam,   // first message parameter
                  int lParam    // second message parameter
                  );
     
            private string[] Arguments;
     
            private void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                // si elle a quelque chose à dire
                if (Arguments.Length != 0)
                    this.Send_Message_From_ThirdApp(Arguments);
                else
                    this.Send_Message_From_ThirdApp();
                Thread.Sleep(2000);
                try
                {
                    Application.ExitThread();
                    Application.Exit();
                }
                catch { ;}
            }
            private void Send_Message_From_ThirdApp()
            {
                IntPtr handle = IntPtr.Zero;
                Process[] p = Process.GetProcessesByName("MonAppli");
                if (p.Length != 0)
                {
                    handle = p[0].MainWindowHandle;
                }
                SendMessage(handle, (uint)Program.WM_DDE_REQUEST, 0, 0);
            }
            private void Send_Message_From_ThirdApp(string[] args)
            {
                IntPtr handle = IntPtr.Zero;
                int par1 = 0;
                int par2 = 0;
                Process[] p = Process.GetProcessesByName("MonAppli");
                if (p.Length != 0)
                {
                    handle = p[0].MainWindowHandle;
                }
                if (args.Length > 0)
                {
                    par1 = 1;
                    if (args.Length == 2)
                        par2 = 1;
                    else if (args.Length > 2)
                    {
                        MessageBox.Show("Trop de paramètres pour lancer l'application", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                SendMessage(handle, (uint)Program.WM_DDE_REQUEST, par1, par2);
            }
     
            public Program(string[] args)
            {
                Arguments = args;
                try
                {
                    Process[] p = Process.GetProcessesByName("MonAppli");
                    if (p.Length != 0)
                    {
                        if (args.Length != 0)
                            this.Send_Message_From_ThirdApp(args);
                        else
                            this.Send_Message_From_ThirdApp();
                        try
                        {
                            Application.ExitThread();
                            Application.Exit();
                        }
                        catch { ;}
                    }
                    else
                    {
                        this.Arguments = args;
                        // sinon on la lance
                        ProcessStartInfo myInfo = new System.Diagnostics.ProcessStartInfo("MonAppli.exe");
                        myInfo.WorkingDirectory = @"C:\Program Files\MonAppli.exe";
                        System.Diagnostics.Process.Start(myInfo);
     
                        // on temporise un peu pour que la boucle de traitement du GetMessage dans l'application destinataire soit lancée
                        System.Timers.Timer t = new System.Timers.Timer();
                        t.AutoReset = true;
                        t.Interval = 5000;  // 5 secondes
                        t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
                        t.Start();
                        // on n'enverra le message qu'à échéance
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("Lancement de MonAppli impossible !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    try
                    {
                        Application.ExitThread();
                        Application.Exit();
                    }
                    catch { ;}
                }
            }
     
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// si 1er argument non vide alors wParam = 1, sinon = 0
            /// si 2eme argument non vide alors wParam = 1, sinon = 0
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                try
                {
                    Program prog = new Program(args);
                    Application.Run(prog);
                }
                catch { ;}
            }
        }
    et coté réception dans le conteneur MDI de MonAppli.exe :
    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
     
            public const int WM_DDE_REQUEST = 0x3E6;
     
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case WM_DDE_REQUEST:
                        try
                        {
                            MessageBox.Show(m.WParam.ToString() + "" + m.LParam.ToString());
                        }
                        catch
                        {;}
                        break;
                    default:
                        base.WndProc(ref m);
                        break;
                }
            }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    voilà le problème résolu grace à :
    http://ryanfarley.com/blog/archive/2004/05/10/605.aspx


    il suffisait comme je le suspectait d'envoyer le bon message ! ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public const int RF_TESTMESSAGE = 0xA123;

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/02/2009, 16h33
  2. D'une macro vers une appli
    Par toinoo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/04/2008, 13h47
  3. Drag & Drop : D'une application vers une appli java
    Par elfiestador dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 01/08/2007, 00h45
  4. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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