locked
Selection d'une fenêtre RRS feed

  • Question

  • Bonjour,

    Je souhaite sélectionner la fenetre située en dessous de mon application WinForms pour lui envoyer des entrées clavier.

    Pour cela j'utilise le code suivant :

    enum GetWindow_Cmd : uint
            {
                GW_HWNDFIRST = 0,
                GW_HWNDLAST = 1,
                GW_HWNDNEXT = 2,
                GW_HWNDPREV = 3,
                GW_OWNER = 4,
                GW_CHILD = 5,
                GW_ENABLEDPOPUP = 6
            }
     
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern IntPtr GetForegroundWindow();
     
            [return: MarshalAs(UnmanagedType.Bool)]
            [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern bool SetForegroundWindow(IntPtr hwnd);
     
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
    IntPtr ptrSrcWindow = GetForegroundWindow();
                IntPtr ptrDstWindow = GetWindow(ptrSrcWindow, GetWindow_Cmd.GW_HWNDNEXT);
                SetForegroundWindow(ptrDstWindow);
    Ce code fait bien apparaitre la fentre du dessous, mais je n'ai pas le focus sur cette fenetre.

    J'ai également essayé avec les fonction GetActiveWindow et SetActiveWindow mais cela ne donne rien.

    Comment faire pour sélectionner la fenêtre du dessous et avoir le focus?

    Merci d'avance.
    mercredi 3 mars 2010 14:39

Réponses

  • J' ai trouvé une solution partielle :

                IntPtr ptrSrcWindow = GetForegroundWindow();
    
                IntPtr ptrDstWindow = FindWindow("Notepad", null);
                
                SetForegroundWindow(ptrDstWindow);
                while (GetForegroundWindow() != ptrDstWindow)
                {
    
                }
                SetActiveWindow(ptrDstWindow);
    Ce code fonctionne et me bascule bien sur le bloc-notes.
    L'inconvénient, c'est que je ne peux choisir ma fenêtre, car je passe le paramètre null.
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    lundi 8 mars 2010 06:16
  • Re Bonjour,

    Apriori la solution que j'ai proposé ne conviens pas ou passé a la trappe :)
    J'ai trouvé un lien dans mes favoris qui propose une large possibilité d'interaction avec les fenêtres aller voir les video de Mitsu Furuta sur le lien suivant

    Vidéos des Rencontres Windows Forms (juin 2005) - Part 2 : Les objets fenêtres et les techniques d’affichage



    Je pense que la solution ce trouve dedans :)

    A bientot
    Cordialement, Troxsa
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    lundi 8 mars 2010 14:31
  • Bonjour,

    Merci TroXsA pour le lien.

    Perpetualsnow, si vous ne réussissez pas faire le truc à partir de lien de TroXsA, je vous prie de poster ici la version finale de votre fonction.

     

    Je vous conseille d’essayer aussi avec ce code. Je l’ai testé et il marche pour moi :

    [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)

            {

                IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");

                if (!handle.Equals(IntPtr.Zero))

                {

                    if (SetForegroundWindow(handle))

                    {

                        SendKeys.Send("hello");

                        SendKeys.Send("{TAB}");

                        SendKeys.Send("{ENTER}");

                    }

                }

     

            }

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    mardi 9 mars 2010 09:23

Toutes les réponses

  • Bonjour,

    Pouvez-vous m'envoyer un projet qui reproduit le problème sur : gilles.tourreau@pos.fr.
    Merci de mettre le lien de cette discussion dans l'e-mail.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mercredi 3 mars 2010 21:56
  • Bonjour,

     

    Pour créer une application qui envoie des entrées clavier vers une autre page, je vous conseille de lire aussi le didacticiel Envoyer une commande dans une autre application 

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    jeudi 4 mars 2010 10:21
  • Bonjour,

    juste pour savoir un petit truc ce code ne fait pas la même choses pour avoir le focus ?

            AppActivate(4992)
            AppActivate("Sans titre - Bloc-notes")


    Cordialement, Troxsa
    dimanche 7 mars 2010 22:29
  • J' ai trouvé une solution partielle :

                IntPtr ptrSrcWindow = GetForegroundWindow();
    
                IntPtr ptrDstWindow = FindWindow("Notepad", null);
                
                SetForegroundWindow(ptrDstWindow);
                while (GetForegroundWindow() != ptrDstWindow)
                {
    
                }
                SetActiveWindow(ptrDstWindow);
    Ce code fonctionne et me bascule bien sur le bloc-notes.
    L'inconvénient, c'est que je ne peux choisir ma fenêtre, car je passe le paramètre null.
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    lundi 8 mars 2010 06:16
  • Bonjour,

     

    Donc vous avez plusieurs fenêtres notepad ouvertes ? Vous pouvez mettre le titre de la fenêtre au lieu du paramètre null, pour choisir parmi plusieurs instances de notepad.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    lundi 8 mars 2010 10:41
  • Non, il n'y a qu'in seule fenêtre ouverte.
    Mais mon code ne fonctionne pas en passant le nom de la fenêtre en paramètre. D'où l'idée d'utiliser null.
    lundi 8 mars 2010 13:33
  • Re Bonjour,

    Apriori la solution que j'ai proposé ne conviens pas ou passé a la trappe :)
    J'ai trouvé un lien dans mes favoris qui propose une large possibilité d'interaction avec les fenêtres aller voir les video de Mitsu Furuta sur le lien suivant

    Vidéos des Rencontres Windows Forms (juin 2005) - Part 2 : Les objets fenêtres et les techniques d’affichage



    Je pense que la solution ce trouve dedans :)

    A bientot
    Cordialement, Troxsa
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    lundi 8 mars 2010 14:31
  • Bonjour,

    Merci TroXsA pour le lien.

    Perpetualsnow, si vous ne réussissez pas faire le truc à partir de lien de TroXsA, je vous prie de poster ici la version finale de votre fonction.

     

    Je vous conseille d’essayer aussi avec ce code. Je l’ai testé et il marche pour moi :

    [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)

            {

                IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");

                if (!handle.Equals(IntPtr.Zero))

                {

                    if (SetForegroundWindow(handle))

                    {

                        SendKeys.Send("hello");

                        SendKeys.Send("{TAB}");

                        SendKeys.Send("{ENTER}");

                    }

                }

     

            }

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mercredi 10 mars 2010 10:33
    mardi 9 mars 2010 09:23