[..] Comment distinguer les fenêtres ouvertes à l'écran ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
freed
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 24 juin 2011 22:51
Status : Hors ligne

[..] Comment distinguer les fenêtres ouvertes à l'écran ?

#1

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#2

Message 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 :roll: ).
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 ???
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#3

Message 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 !
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Docteur
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 23 juin 2011 10:55
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#4

Message 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.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#5

Message 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
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]
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
freed
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 24 juin 2011 22:51
Status : Hors ligne

Re: [R] Comment distinguer les fenêtres ouvertes à l'écran ?

#6

Message 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 ...).
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#7

Message par Tlem »

@mikell Effectivement (comme de quoi, même l'admin peut dire certaines choses un peut vite :mrgreen: ).
Winlist doit surement se baser sur le PID des fenêtres. Donc attention ce n'est peut être pas du 100%. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#8

Message 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
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#9

Message 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)
Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#10

Message 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 !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment distinguer les fenêtres ouvertes à l'écran

#11

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre