Controler le pointeur d'un processus afin d'écrire dans une application externe.

Signaler
Messages postés
18
Date d'inscription
dimanche 16 novembre 2003
Statut
Membre
Dernière intervention
15 juin 2009
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour, voici une petit problème pour les gros barbus du C#.

Je chercher à écrire dans le focus depuis mon applicaiton C# qui tourne en tache de fond.
Par exemple. Imaginons que mon appli C# possède une variable monMot de type string qui contient "toto" (soyons original).
Maintenant si je suis sur MicrosoftWord (ma page contient déja un bon gros paquet de caractères), j'aimerais commander à mon application C# d'écrire "toto" sur ma page MicrosoftWord à la position du curseur.

Pour ce fait, je suis parti du principe qu'il fallait récupérer le nom du focus ( application en premier plan, dans mon exemple :MicrosoftWord): ce que j'arrive à faire.
Puis dans un second temps d'utiliser le curseur présent sur la fenetre MicrosoftWord afin d'y ajouter les caractères présent dans la variable monMot (dans mon exemple "toto"). Je pense qu'il s'agit ici d'utiliser le handler (pointeur), mais je ne sais pas comment l'utiliser à bon essiant.

Voici mon code actuel:

             //import de dll
            System.Runtime.InteropServices.DllImport("user32.dll")]
            private static extern IntPtr GetForegroundWindow();  

             String monMot="toto";
      
            //on récupère le focus
            IntPtr handle = GetForegroundWindow();

            //on récupère la liste des processus
            Process[] myProcesses = Process.GetProcesses();
            //on parcour l'ensemble des processus
            foreach (Process myProcess in myProcesses)
            {
                //on cherche le focus dans la liste de processus
                if (myProcess.MainWindowHandle == handle)
                {
                         //ici, myProcess.ProcessName aura comme valeur "word" 
                        ?????????????Comment écrire dans mon fichier word???????
                }
            }

Voilà donc mon souci, si je n'ai pas été assez clair, n'hésitez pas à poser des questions.
Si je me goure comptement, et qu'il y a un autre moyen de remplir d'insérer "toto" dans mon fichier word n'hséitez pas à me le dire.

Merci d'avance pour ceux qui se sentiront de se pencher sur ce problème.

3 réponses

Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Peut être que cette source pourra t'aider.


Working as designed
www.nikoui.fr
Messages postés
18
Date d'inscription
dimanche 16 novembre 2003
Statut
Membre
Dernière intervention
15 juin 2009

Ok, merci beaucoup de ta réponse, j'ai effectivement utilisé le SendKeys, qui est trés parfaitement adapté à ce cas.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, il est possible d'envoyer des messages WM_CHAR si on connait le contrôle d'édition à cibler.. un exemple avec Notepad :

using System.Runtime.InteropServices;
using System.Diagnostics;


namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1( )
        {
            InitializeComponent( );


            Button b = new Button( );
            b.Parent = this;
            b.Text = "Write to Notepad";
            b.Click += delegate { WriteToNotepad( "Hello World !" ); };
        }


        private const int WM_CHAR = 0x0102;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;
        private const string WINDOW_NAME = "Sans titre - Bloc-notes"; // Fr


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern IntPtr FindWindow
            ( string className, string windowName );


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern bool PostMessage
            ( IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam );


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern IntPtr FindWindowEx
            ( IntPtr hWndParent, IntPtr hWndChild, string className, string WindowName );
   
        private void WriteToNotepad( string text )
        {
            // Cherche si un nouvelle fenêtre de notepad est déja ouverte.
            IntPtr hWnd = FindWindow( null, WINDOW_NAME );


            // Ouvre une nouvelle fenêtre de notepad.
            if ( hWnd == IntPtr.Zero )
            {
                Process p = Process.Start( "notepad.exe" );
                p.WaitForInputIdle( 500 );
                hWnd = p.MainWindowHandle;
                p.Close( );
                p = null;
            }


            // Obtient le fenêtre d'édition.
            //hWnd = FindWindowEx( hWnd, IntPtr.Zero, "Edit", null );


            if ( hWnd == IntPtr.Zero )
                throw new Win32Exception( Marshal.GetLastWin32Error( ) );


            foreach( char c in text )
                PostMessage( hWnd, WM_CHAR, ( UIntPtr )c, IntPtr.Zero );
        }
    }
}