Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Fenêtre ouverte dans Windows | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Fenêtre ouverte dans Windows Ven 18 Fév 2022 - 15:05 | |
| Peut-être une question bête... Est-il possible de récupérer en temps réel dans Windows les coordonnées de la fenêtre ouverte par l'exécution d'un programme quelconque: x, y, w, h ? Par exemple je lance Firefox, je voudrais dans un programme (écrit en Panoramic !) récupérer l'emplacement et les dimensions actuels de sa fenêtre. Ça existe forcément quelque part dans Windows, mais est-ce accessible ? En fait je voudrais dans mon programme Panoramic récupérer le contenu d'une zone donnée de la fenêtre du programme cible. | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Fenêtre ouverte dans Windows Ven 18 Fév 2022 - 21:23 | |
| Ce n'est pas très compliqué si tu connais le texte qui apparait dans le bandeau de la fenêtre ("FireFox" je suppose).
Tu appelles la fonction FindWindow de la DLL User32, en lui passant en paramètre le texte du bandeau. Cette fonction te retourne le handle de la fenêtre, et à partir du handle, tu peux connaitre la position et la taille de la fenêtre en appelant la fonction GetWindowRect de cette même DLL. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Fenêtre ouverte dans Windows Ven 18 Fév 2022 - 21:44 | |
| Bonsoir Jack, Et un grand merci pour ces précisions que je vais étudier de près ! PS Pas évident de paramétrer l'appel à la user32... pour le moment j'y arrive pas... | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Fenêtre ouverte dans Windows Sam 19 Fév 2022 - 9:11 | |
| - JL35 a écrit:
- Pas évident de paramétrer l'appel à la user32...
pour le moment j'y arrive pas... Voici un début (je n'ai pas le temps de continuer ...) : - Code:
-
dim handle%,adrs%,nom$ dll_on "user32.dll" rem recherche du handle de la fenêtre "Calculatrice" nom$="Calculatrice" adrs%=adr(nom$) peek_reverse handle%=dll_call2("FindWindowA",0,peek32(adrs%)) if handle% <> 0 print "handle de la fenêtre = "+str$(handle%)
rem recherche de la position et de la taille rem A COMPLETER
else print "la fenêtre n'existe pas" end_if dll_off end J'ai pris l'exemple de la Calculatrice. Tu lances la Calculatrice de Windows et tu exécutes ce code: il te fournit le handle de la fenêtre de la calculatrice. Si la calculatrice n'est pas lancée, il te l'indique (print "la fenêtre n'existe pas") car dans ce cas, la valeur du handle est nulle. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 19 Fév 2022 - 11:04 | |
| Salut tout le monde ! Tu as les fonction de KGF : - GetWindowByTitle qui te renvoie le handle d'une fenêtre dont tu connais le titre. - GetFormMetrics qui te renvoie les dimensions et je pense la position d'une fenêtre dont on connait le handle. - GetFormClientMetrics pour ce qui doit être de la surface client. Ha ce Klaus...si on ne l'avait pas il faudrait l'inventer. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Fenêtre ouverte dans Windows Sam 19 Fév 2022 - 12:04 | |
| Merci Jack, je pense qu'avec ton exemple tout va aller mieux :
Yannick, je e suis dit après coup que j'aurais du regarder dans KGF.dll, c'est ce que je vais faire.
Merci en tout cas à vous deux, ça m'aide beaucoup ! | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Fenêtre ouverte dans Windows Sam 19 Fév 2022 - 12:18 | |
| J'ai terminé mon code. Le voici au complet avec l'exemple de la Calculatrice de Windows. Je l'ai commenté. Il faut bien-sûr remplacer "Calculatrice " par le contenu du bandeau de la fenêtre désirée. - Code:
-
dim handle%,adrs%,bidon%,texte$,texte2$ dll_on "user32.dll"
rem recherche du handle de la fenêtre "Calculatrice" texte$="Calculatrice" adrs%=adr(texte$): rem adresse de l'adresse de texte$ peek_reverse: rem car Windows est du type Big Endian handle%=dll_call2("FindWindowA",0,peek32(adrs%)): rem peek32 est donc un pointeur sur texte$
rem si handle% est nul, la fenêtre n'existe pas
if handle% <> 0 print "handle de la fenêtre = "+str$(handle%): rem pour info
rem recherche de la position et de la taille texte2$="ABCDABCDABCDABCD": rem string de 4 fois 4 octets pour recueillir LEFT, TOP, RIGHT, BOTTOM
rem texte2$ doit être considéré comme un "buffer de réception" pour la fonction GetWindowRect
adrs%=adr(texte2$) : rem adresse de l'adresse de texte2$ bidon%=dll_call2("GetWindowRect",handle%,peek32(adrs%)): rem cette fonction GetWindowRect va remplir texte2$
adrs%=peek32(adrs%): rem pointeur sur la réponse de GetWindowRect, c'est à dire directement sur le contenu de text2$
rem on exploite la réponse de GetWindowrect : print "LEFT = "+str$(peek32(adrs%)) print "TOP = "+str$(peek32(adrs%+4)) print "RIGHT = "+str$(peek32(adrs%+8)) print "BOTTOM = "+str$(peek32(adrs%+12)) print "WIDTH = "+str$(peek32(adrs%+8)-peek32(adrs%)): rem RIGHT - LEFT print "HEIGHT = "+str$(peek32(adrs%+12)-peek32(adrs%+4)): rem BOTTOM - TOP else print "la fenêtre n'existe pas" end_if dll_off end - JL35 a écrit:
- je e suis dit après coup que j'aurais du regarder dans KGF.dll, c'est ce que je vais faire.
Tu comprendras que je me devais de te répondre avec un code en "panoramic pur". Ceci dit, la DLL de Klaus est remarquable, autant par sa simplicité d'utilisation que par sa documentation très riche et précise. Elle peut rendre service dans beaucoup de cas. Je reconnais que ce code n'est pas pour un "programmeur du dimanche" mais si quelqu'un a des questions sur ce code, je me ferai une joie de donner des explications. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Fenêtre ouverte dans Windows Sam 19 Fév 2022 - 13:59 | |
| Dans tous les cas, un grand merci à toi Jack pour cet exemple complet. C'est vrai qu'on ne sert pas de ces fonctions tous les jours, mais quand on en a besoin on est bien contents de les trouver Je vais étudier ton code plus en détail. En attendant je regardais chez l'ami klaus et j'en ai déduit cette petite sub qui répond à mes besoins immédiats: - Code:
-
DIM Titre$,x1%,y1%,w1%,h1%,x2%,y2%,w2%,h2% Titre$ = "PANORAMIC EDITOR": ' Titre de la fenêtre cherchée Fenetre_Win(Titre$) font_size 0,12 print: PRINT " x1 = "+STR$(x1%)+" y1 = "+STR$(y1%)+" w1 = "+STR$(w1%)+" h1 = "+STR$(h1%) print: PRINT " x2 = "+STR$(x2%)+" y2 = "+STR$(y2%)+" w2 = "+STR$(w2%)+" h2 = "+STR$(h2%) END
SUB Fenetre_Win(Titre$) ' Position et dimensions externes et internes de la fenêtre d'exécution ' contenant la séquence Titre$ ' Ex: Fenetre_Win("Portail Orange") ' Résultat dans les variables suivantes définies dans l'appelant: ' x1%,y1%,w1%,h1% (position et dimensions externes de la fenêtre) ' et dans x2%,y2%,w2%,h2% (idem internes, sans les bordures) DIM_LOCAL kgf$,res%,hnd% kgf$ = "C:\PANORAMIC\KGF\KGF.dll": ' À ajuster ! DLL_ON kgf$ hnd% = dll_call2("GetWindowByTitle",1,adr(titre$)): ' n° handle ' position et dimensions externes res% = DLL_call5("GetFormMetrics",hnd%,adr(x1%),adr(y1%),adr(w1%),adr(h1%)) ' position et dimensions internes (sans les bordures) res% = DLL_call5("GetFormClientMetrics",hnd%,adr(x2%),adr(y2%),adr(w2%),adr(h2%)) DLL_OFF END_SUB PS à Jack, je viens de tester ton code qui est très instructif et efficace, merci ! Du coup j'en ai fait une sub, copiée quasi textuellement sur ton exemple: - Code:
-
IM Titre$,x%,y%,w%,h% Titre$ = "PANORAMIC EDITOR" Fenetre_W1(Titre$) print "Left= "+STR$(x%): PRINT " Top= "+STR$(y%) PRINT "larg= "+STR$(w%): PRINT "Haut= "+STR$(h%) END
SUB Fenetre_W1(Titre$) ' Position et dimensions de la fenêtre d'exécution du programme contenant ' la chaîne Titre$ dans le titre de la fenêtre. ' Résultats dans x%,y%,w%,h% définis dans l'appelant DIM_LOCAL handle%,adrs%,bidon%,texte2$,x1%,y1% DLL_ON "user32.dll" ' recherche du handle de la fenêtre adrs%=ADR(Titre$): ' adresse de l'adresse de texte$ PEEK_REVERSE: ' car Windows est du type Big Endian handle%=DLL_CALL2("FindWindowA",0,PEEK32(adrs%)): ' peek32 est donc un pointeur sur Titre$ ' si handle% est nul, la fenêtre n'existe pas IF handle% <> 0 ' recherche de la position et de la taille texte2$="ABCDABCDABCDABCD": ' string 4x4 octets pour LEFT, TOP, RIGHT, BOTTOM ' texte2$ doit être considéré comme un "buffer de réception" pour la fonction GetWindowRect adrs%=adr(texte2$) : ' adresse de l'adresse de texte2$ bidon%=DLL_CALL2("GetWindowRect",handle%,PEEK32(adrs%)): ' cette fonction GetWindowRect va remplir texte2$ adrs%=PEEK32(adrs%): ' pointeur sur la réponse de GetWindowRect, c'est à dire directement sur le contenu de text2$ ' on exploite la réponse de GetWindowrect : x% = PEEK32(adrs%): y% = PEEK32(adrs%+4): ' haut/gauche x1% = PEEK32(adrs%+8): y1% = PEEK32(adrs%+12): ' bas/droite w% = x1%-x%: h% = y1%-y%: ' -> largeur/hauteur ELSE MESSAGE "la fenêtre n'existe pas" END_IF DLL_OFF END_SUB | |
| | | Contenu sponsorisé
| Sujet: Re: Fenêtre ouverte dans Windows | |
| |
| | | | Fenêtre ouverte dans Windows | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |