Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer de fenêtre Win32

pywin32

    26 octobre 2021 à 7:31:42

    Bonjour,

    Dans mon code python, je manipule une fenêtre dans windows via la librairie pywin32. Toutefois, il peut m'arriver qu'il y ait plusieurs fois la même application qui soit lancé.

    Par exemple, avec Word. Si je veux rendre une fenêtre visible, il me suffit de faire :

    import win32com.client
    w=win32com.client.Dispatch("Word.Application")
    w.Visible=1

    Toutefois, quand il y a 2 voir plus de fenêtre, comment puis-je faire pour spécifier qu'il s'agit d'une autre fenêtre que je veux manipuler ? J'ai l'impression que part défaut il considère la dernière qui a été manipulée.

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2021 à 14:59:50

      voir ce sujet SO https://stackoverflow.com/questions/61151811/how-to-get-handle-for-a-specific-application-window-in-python-using-pywin32 je pense

      En gros, il faut récupérer et afficher le titre de la fenêtre que tu veux manipuler/afficher

      -
      Edité par umfred 26 octobre 2021 à 15:00:25

      • Partager sur Facebook
      • Partager sur Twitter
        27 octobre 2021 à 14:03:47

        Merci pour la réponse.

        J'avais déjà vu ce sujet, et il ne réponds qu'en partie à la question.

        En effet, si j'ouvre 2 instances d'Excel (qui vont donc s'appeler "Classeur1" et "Classeur2"), et que je lance ce code python :

        # -*- coding: utf-8 -*-
        import win32com.client  # Module for COM interface
        
        # start first instance
        exl1 = win32com.client.Dispatch("Excel.Application")
        
        # start second instance
        exl2 = win32com.client.Dispatch("Excel.Application")
        
        print(exl1.ActiveWorkbook.FullName)
        print(exl2.ActiveWorkbook.FullName)


        Voici ce qu'il m'affiche :

        Classeur1
        Classeur1

        Donc, comme on peut le voir, il n'a associé qu'un seul classeur. Donc, je ne suis pas en mesure de sélectionner le second.

        Aussi, à partir de cette discussion https://stackoverflow.com/a/60139403, je suis en mesure de récupérer le numéro HWND et le nom complet de la fenêtre désiré, mais je n'ai pas trouvé comment m'en servir pour l'associer à "xl2" (par exemple).

        -
        Edité par JeanYves31 27 octobre 2021 à 14:05:29

        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2021 à 15:33:38

          ça t'affiche Classeur1 parce que c'est le classeur actif

          Et en fait tu n'as besoin que d'une instance d'Excel, ensuite, tu ajoutes/ouvres les classeurs

          (en fait, ça doit dépendre un peu aussi de la version d'excel, si elle gère ou non plusieurs instances, mais les plus récentes versions n'ont besoin que d'une instance

          import win32com.client
          
          excel=win32com.client.Dispatch("Excel.Application")
          
          xl1=excel.Workbooks.Add()
          xl2=excel.Workbooks.Add()
          
          print(xl1.FullName)
          print(xl2.FullName)

          Ensuite il faut travailler avec les objets Excel de la ref VBA (adapter à la syntaxe python)
          https://docs.microsoft.com/en-us/office/vba/api/excel.workbooks 

          Ne pas oublier de relâcher les ressources avec excel=None en fin de programme, sinon un Excel sera toujours en tâche de fond

          -
          Edité par umfred 27 octobre 2021 à 15:35:22

          • Partager sur Facebook
          • Partager sur Twitter
            27 octobre 2021 à 15:48:59

            En fait, c'est un peu plus compliqué que ça.

            La raison principale, c'est que c'est une application métier, j'ai pris Excel comme exemple parce que c'est disponible à presque tout le monde.

            La deuxième raison, c'est parce que les fenêtres sont déjà ouvertes quand je lance mon script python.

            Donc, malheureusement, je ne peux pas faire comme tu propose.

            Toutefois, je retiens ton commentaire sur "Excel=None", ça peut m'être utile, je vérifierai.

            • Partager sur Facebook
            • Partager sur Twitter
              27 octobre 2021 à 16:11:14

              JeanYves31 a écrit:

              La raison principale, c'est que c'est une application métier, j'ai pris Excel comme exemple parce que c'est disponible à presque tout le monde.

              Si on crée 2 fichiers EXCEL et qu'on leur ajoute un workbook, leur nom sera identique: votre tests ne dit pas grand chose et çà n'a rien à voir avec les "fenêtres" ou l'application qui va avoir le focus à l'instant t.

              JeanYves31 a écrit:

              La deuxième raison, c'est parce que les fenêtres sont déjà ouvertes quand je lance mon script python.

              Comment se connecter via un client COM a une application Win32/COM déjà démarrée? C'est plutôt dans les forums WIndows qu'on va pouvoir vous répondre. Après comment appeler les primitives COM qui vont bien depuis Python... pywin32 est juste fait pour çà.

              • Partager sur Facebook
              • Partager sur Twitter
                27 octobre 2021 à 16:56:49

                avec l'utilisation win32gui peut-être

                import win32gui
                
                def callback_Excel(handle,liste):
                    titre=win32gui.GetTexWindow(handle)
                    if titre.lower().find("excel")>0: #si le titre de la fenêtre contient "excel"
                        liste.append([t,handle]) # on rajoute le titre de la fenêtre et son handle
                
                results=[]
                win23gui.EnumWindows(callback_Excel,results)
                print(results)

                Zut, c'est le principe du lien que tu as trouvé (je ne l'avais pas consulté avant), je laisse le code si ça peut servir

                Mais tu veux en faire quoi du handle ensuite ? 
                Avec un SetFocus et SetForegroundWindow ou SetActiveWindow, on peut la ramener au dessus (https://yiyibooks.cn/__trs__/meikunyuan6/pywin32/pywin32/PyWin32/win32gui.html)

                • Partager sur Facebook
                • Partager sur Twitter
                  29 octobre 2021 à 7:54:35

                  umfred a écrit:

                  Mais tu veux en faire quoi du handle ensuite ? 

                  Je comptais m'en servir pour indiquer quelle fenêtre associé à l'objet "xl2"

                  umfred a écrit:

                  Avec un SetFocus et SetForegroundWindow ou SetActiveWindow, on peut la ramener au dessus (https://yiyibooks.cn/__trs__/meikunyuan6/pywin32/pywin32/PyWin32/win32gui.html)

                  J'ai déjà essayé ces 3 méthodes entre le premier et le second "win32com.client.Dispatch" pour forcer la main à mettre une fenêtre par objet, mais sans succès.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Changer de fenêtre Win32

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown