none
Envoyer une commande dans une autre application RRS feed

  • Discussion générale

  • .NET nous offre un moyen facile d'entrée vers une autre application à l'aide de la classe SendKeys .  

    Toutefois, il existe certaines limitations:

     1) l'application cible doit être active.  Par conséquent, nous devons activer l'application cible avant que nous effectuons SendKeys.  La fonction de Windows API FindWindow  peut nous aider à récupérer le handle de fenêtre de l'application cible, et la fonction de Windows API SetForegroundWindow  peut nous aider à activer la fenêtre de l'application spécifique.

     

    2) SendKeys ne fonctionne pas pour une session déconnectée. 

     

    3) SendKeys pourrait produire des résultats imprévisibles lorsque l'application est destinée à une utilisation internationale et utilise une variété de claviers

     

    Pour plus d'informations sur l'envoi de différentes clés à l'aide de SendKeys, reportez-vous à la documentation MSDN :

    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.sendkeys.aspx

     

    Voici un extrait de code pour trouver la fenêtre de Notepad et introduire un texte : 

     

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lp1, string lp2);
            [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
            private void button1_Click(object sender, EventArgs e)
            {
                // trouver window handle de Notepad
                IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");
                if (!handle.Equals(IntPtr.Zero))
                {
                    // activer la fenetre Notepad
                    if (SetForegroundWindow(handle))
                    {
                        // envoyer "Hello World!"
                        SendKeys.Send("Hello World!");
                        // envoyer "Tab"
                        SendKeys.Send("{TAB}");
                        // envoyer "Enter"
                        SendKeys.Send("{ENTER}");
                    }            
                }
            }
    
    

     

    Nous pouvons également utiliser Windows API SendMessage ou PostMessage pour envoyer un message WM_SETTEXT à la fenêtre correspondante. 

     

    La différence fondamentale entre SendMessage et PostMessage est que SendMessage envoie un message à une autre fenêtre en appelant une procédure de cette fenêtre l’attendant de retourner, et PostMessage publie un message dans la file d'attente de messages associé au thread qui a créé la fenêtre spécifiée et retourne immédiatement sans attendre. 

     
     Voici un extrait de code à l'aide de la fonction SendMessage pour la saisie de texte sur le bloc-notes.

     



    private
    const int WM_SETTEXT = 0x000C;
    [DllImport("user32.dll")]
    private
    static extern IntPtr FindWindow( string lpClassName, string lpWindowName);


    [DllImport("User32.dll")] private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindows);
    [DllImport("User32.dll")] private static extern Int32 SendMessage( IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam); private void button1_Click(object sender, EventArgs e) { // recuperer le window handle de Notepad IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad"); if (!hWnd.Equals(IntPtr.Zero)) { // recuperer l' Edit window handle de Notepad IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null); if (!edithWnd.Equals(IntPtr.Zero)) // envoyer WM_SETTEXT message avec "Hello World!" SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!")); } }

     Remarque :

     Nous pouvons utiliser SPY ++ fourni avec Visual Studio pour effectuer le suivi des messages de Windows et de les imiter puis avec SendMessage ou de PostMessage.  

    Pour plus d'informations sur la façon d'utiliser SPY ++, vous pouvez lire la documentation MSDN :

    http://msdn.microsoft.com/fr-fr/library/aa264396(en-us,VS.60).aspx


     


    Alex Petrescu - MSFT

     

     
    mardi 12 janvier 2010 11:04