Page 1 sur 1
[..] Comment distinguer les fenêtres ouvertes à l'écran ?
Posté : dim. 26 juin 2011 22:51
par freed
Bonjour,
Je suis actuellement en apprentissage sur Titre et texte d'une fenêtre (avancé)
http://www.autoitscript.fr/autoit3/docs ... vanced.htm
A la fin du document il est précisé
Il est important de noter que le handle d'une fenêtre n'est pas classé comme un nombre ou une chaîne mais comme sont propre type.
Cela sous-entend t-il que qu'il est impossible de déterminer par un script l'ordre d'affichage des fenêtres à l'écran, et par la même sélectionner une fenêtre dont le titre et la classe ne sont pas connus ?
exemple : SciTEWindow est en fenêtre active, dessous firefox, et sous firefox on trouve le bloc-note.
Précision 1 : cet ordre ne correspond pas à l'ordre d'ouverture des applications (ToolbarWindow32).
Précision 2 : WinList ne détecte pas les fenêtres dans l'ordre d'affichage (cascade). Ne semble donc pas exploitable pour sélectionner le titre de la troisième fenêtre affichée par exemple.
Enfin, si le handle ne permet pas de déterminer dans la cascade des fenêtres celle qui est en troisième, existe t-il une fonction qui le permet (j'ai testé WinGetHandle et GUICreate et n'y suis pas arrivé) ?
Merci.
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : dim. 26 juin 2011 23:26
par Tlem
freed a écrit :Cela sous-entend t-il que qu'il est impossible de déterminer par un script l'ordre d'affichage des fenêtres à l'écran
Faux.
Si vous souhaitez connaitre l'ordre de création des différents processus (et donc aussi des fenêtres), vous avez la possibilité de récupérer leur PID. Le PID est
normalement attribué séquentiellement, mais il se peut dans certains cas que la séquence ne soit pas suivie.
Il y à sur le forum une fonction toute faite qui permet de retrouver le PID à partir du handle.
freed a écrit :et par la même sélectionner une fenêtre dont le titre et la classe ne sont pas connus ?
Faux si vous avez un ou plusieurs autres éléments (tel que le handle par exemple), vous pouvez faire la même chose.
freed a écrit :exemple : SciTEWindow est en fenêtre active, dessous firefox, et sous firefox on trouve le bloc-note.
Précision 1 : cet ordre ne correspond pas à l'ordre d'ouverture des applications (ToolbarWindow32).
Je dirais vrai.
freed a écrit :Précision 2 : WinList ne détecte pas les fenêtres dans l'ordre d'affichage (cascade).
Encore vrai.
freed a écrit :Enfin, si le handle ne permet pas de déterminer dans la cascade des fenêtres celle qui est en troisième, existe t-il une fonction qui le permet (j'ai testé WinGetHandle et GUICreate et n'y suis pas arrivé) ?
Merci.
Il n'y à pas de fonction toute faite pour cela (mais il m'arrive de me tromper

).
Ceci dit, le PID ne vous permettra pas de savoir si la fenêtre X est la troisième fenêtre derrière la fenêtre en premier plan.
Mais en fait, quel serait l'intérêt de connaitre si la fenêtre X est à été créée avant telle fenêtre et si elle est la troisième fenêtre derrière la fenêtre en premier plan ???
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : dim. 26 juin 2011 23:29
par mikell
Il ne semble pas que l'on puisse détecter des états de fenêtre autres que ceux énoncés dans la description de la fonction WinGetState() :
1 = Window exists
2 = Window is visible
4 = Window is enabled
8 = Window is active
16 = Window is minimized
32 = Window is maximized
que ce soit par le titre, le handle ou la classe (ce qui en pratique revient au même, car si vous connaissez l'un vous pouvez savoir l'autre)
Un script pourrait imposer un "z-order" aux fenêtres, quant à le détecter... s'il existait un moyen cela m'intéresserait beaucoup aussi !
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : lun. 27 juin 2011 11:55
par Docteur
Bonjour,
La fonction WinList() liste bien les fenêtres dans l'ordre d'affichage, de celle qui est au-dessus de toutes les autres à celle qui est en-dessous de toutes les autres.
Code : Tout sélectionner
$allWindows = WinList()
; La fenêtre au-dessus de toutes les autres
$allWindows[1][1]
; La fenêtre en-dessous de toutes les autres
$allWindows[ $allWindows[0][0] ][1]
Cordialement,
Le docteur.
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : lun. 27 juin 2011 14:22
par mikell
Hé Tlem, il semble bien qu'il ait raison le docteur !
Je viens de faire plusieurs essais avec 5 ou 6 fenêtres empilées dans un ordre différent de celui de leur ouverture, en utilisant ce script qui est celui du fichier d'aide :
► Afficher le texte
Code : Tout sélectionner
$var = WinList()
For $i = 1 to $var[0][0]
; Only display visible windows that have a title
If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
MsgBox(0, "Details", "Title=" & $var[$i][0] & @LF & "Handle=" & $var[$i][1])
EndIf
Next
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
et l'ordre dans lequel les titres de fenêtre sont renvoyés correspond bien au z-order tel qu'à l'écran !
[Mode Etudiant = ON]
Comme quoi on devrait toujours d'abord tester soi-même...
Donc pour déterminer dans la cascade des fenêtres celle qui est en troisième : $var[3][0] ou $var[3][1]
Merci Docteur
[Mode Etudiant = OFF]
Re: [R] Comment distinguer les fenêtres ouvertes à l'écran ?
Posté : lun. 27 juin 2011 21:36
par freed
Vraiment désolé ! et merci à vous !
Je me suis fourvoyé ! En effet l'ordre des fenêtres est bien rendu par winlist (je ne comprends pas comment je ne m'en suis pas rendu compte malgré mes nombreux tests ...).
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : lun. 27 juin 2011 21:56
par Tlem
@mikell Effectivement (comme de quoi, même l'admin peut dire certaines choses un peut vite

).
Winlist doit surement se baser sur le PID des fenêtres. Donc attention ce n'est peut être pas du 100%.

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : mer. 17 août 2011 17:25
par ZDS
Bonjour,
Désolé de relancer un sujet visiblement inactif depuis presque 2 mois, mais je voulais savoir si quelqu'un avait au final réussi à obtenir une liste ordonnée des fenêtres présentes dans la barre des tâches (juste les handles ou les PID si ça arrange).
L'ordre que je recherche n'est pas celui des fenêtres de la plus récemment activée à la plus anciennement active (ça c'est facile, un combo WinList/GetState et c'est parti), ni l'ordre de lancement des fenêtres (qui peut être faussée par des WinSetState(...,@SW_HIDE)/WinSetState(...,@SW_SHOW)), mais bien celui visible au moment T dans la barre des tâches de gauche à droite.
En fait mon but final est de pouvoir réorganiser à la volée l'ordre des fenêtres dans cette taskbar (sous XP, à la manière de Seven/Vista+, grâce au WinSetState(HIDE/SHOW) justement) .
Merci d'avance et à bientôt !
ZDS
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : jeu. 18 août 2011 01:33
par mikell
Ben là on parle de ToolbarWindow32 (Shell_TrayWnd)
Donc pour les fenêtres
visibles dans la taskbar
Code : Tout sélectionner
#include <GuiToolBar.au3>
$text = "PrID" &Chr(9)& "Texte"& @CRLF & "---------------------------------" & @CRLF
$hToolbar = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[CLASS:ToolbarWindow32; INSTANCE:2]')
$count = _GUICtrlToolbar_ButtonCount($hToolbar)
For $i = 1 To $count
$iCmd = _GUICtrlToolbar_IndexToCommand($hToolbar, $i)
$state = _GUICtrlToolbar_GetButtonState($hToolbar, $iCmd)
If BitAnd($state, $TBSTATE_HIDDEN) <> $TBSTATE_HIDDEN Then
$item = _GUICtrlToolbar_GetButtonText($hToolbar, $iCmd)
$text &= WinGetProcess($item) &Chr(9)& $item & @CRLF
EndIf
Next
Msgbox(0,"",$text)

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : jeu. 18 août 2011 10:08
par ZDS
Bonjour,
Pardon, j'aurais dû être plus précis dans ma demande : je connais déjà ce genre de script qui utilise les fonctions _GUICtrlToolbar_XXX. Le problème, c'est qu'il se base sur des noms de boutons qui correspondent à des noms de fenêtres (donc trop peu fiable!), et donc que pour des fenêtres ayant le même nom ou le même début de nom, il n'arrive pas à les ordonner proprement. Encore pire avec les fenêtres de navigateur : En cherchant à prendre en compte la première fenêtre Opera qui (par exemple) est cablée sur un onglet "vide" (Le nom est donc "Opera"), il me trouve la fenêtre Opera dernièrement activée (dans l'exemple "Opera - Netvibes (142)") et non la fenêtre demandée ... :s
Dans le listing, au lieu d'avoir les ids des fenêtres :
- "Opera" (navigateur n°1)
- "U:\Exemple.au3 - SciTE" (Scintilla)
- "Opera - Netvibes (142)" (navigateur n°2)
- "Boîte de réception - Microsoft Outlook" (client mail)
- "C:\Test" (explorer n°1)
- "C:\Test" (explorer n°2)
Si (imaginons le pire) le z-order est inverse à l'ordre ci dessus (la dernière active est donc la dernière de la liste), on se retrouve avec les ids suivants :
- "Opera - Netvibes (142)" (navigateur n°2) (la première fenêtre trouvée selon le z-order commençant par "Opera")
- "U:\Exemple.au3 - SciTE" (Scintilla)
- "Opera - Netvibes (142)" (navigateur n°2)
- "Boîte de réception - Microsoft Outlook" (client mail)
- "C:\Test" (explorer n°2) (la première fenêtre trouvée selon le z-order s'appelant "C:\Test")
- "C:\Test" (explorer n°2)
Je pense bien que le souci est "minime" pour certains, mais pour moi ça veut dire beaucoup ça peut faire des dégâts. Au final, "La solution la plus simple est toujours la meilleure si on n'a pas besoin de plus" ^^
Merci d'avance, à bientôt !
Re: [..] Comment distinguer les fenêtres ouvertes à l'écran
Posté : jeu. 18 août 2011 12:50
par mikell
Ouye...
Comme un bouton de la taskbar est un "faux" controle, tout ce qu'on peut récupérer comme handle c'est celui de la fenêtre qui l'a créé (avec un WinGetHandle)
Mais les fonctions _GUICtrlToolbar_XXX ne se basant pas que sur les noms, on peut utiliser son index dans la toolbar ou carrément son 'command identifier', qui est unique et ne change pas quel que soit le z-order des fenêtres
$iCmd = Command identifier associated with the button. This identifier is used in a $WM_COMMAND message when the button is chosen.
Code : Tout sélectionner
#include <GuiToolBar.au3>
$text = "Index" &Chr(9)& "CmdID" &Chr(9)& "hWnd" &Chr(9)&Chr(9)& "Texte"& @CRLF
$text &= "--------------------------------------------------------------------------------" & @CRLF
$hToolbar = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[CLASS:ToolbarWindow32; INSTANCE:2]')
$count = _GUICtrlToolbar_ButtonCount($hToolbar)
For $i = 1 To $count
$iCmd = _GUICtrlToolbar_IndexToCommand($hToolbar, $i)
$state = _GUICtrlToolbar_GetButtonState($hToolbar, $iCmd)
If BitAnd($state, $TBSTATE_HIDDEN) <> $TBSTATE_HIDDEN Then
$item = _GUICtrlToolbar_GetButtonText($hToolbar, $iCmd)
$handle = WinGetHandle($item)
$text &= $i &Chr(9)& $iCmd &Chr(9)& $handle &Chr(9)& $item & @CRLF
EndIf
Next
Msgbox(0,"",$text)