Page 1 sur 1
[R] Detection de fenêtre "polymorphe"
Posté : ven. 30 avr. 2010 10:16
par Pelagos
Bonjour.
Toujours avec mon robot, j'ai un dernier petit problème. Comment détecter une fenètre qui peut poper a n'importe quel moment, mais surtout qui n'a pas de nom, et dont le texte et les dimensions changent a chaque fois ! Cette fenêtre étant extremement rare, je n'ai pas reussi a provoquer son apparition pour essayer de chopper un paramètre pour la cibler via AWI.
Y a t'il, en gros, un moyen de dire "IF n'importe quoi d'autre s'ouvre, THAN ..." ?
J'ai pensé utiliser la fonction winList en AdlibRegister, mais ma fenetre n'a pas de titre...
La fenetre en question est, bien sur un message d'erreur.
J'ai reussi a gerer les erreur "routinières" du prototype, mais celle la...
Merci d'avance.
Re: [...] Detection de fenêtre "polymorphe"
Posté : ven. 30 avr. 2010 21:35
par Tlem
Si cette fenêtre n'a aucun élément qui reste identique, il va être difficile de la repérer.
Le fait qu'elle n'ai pas de titre est une chose, mais cela peut être un point de repère comme un autre, par contre, il vous faudra un ou plusieurs autres éléments comme point de repère.
Regardez si un mot du texte, le style ou tout autre élément peut être un point de repère, sans cela vous n'aurez pas grand chose pour vous aider ...
Peut être (a vérifier), si cette fenêtre apparait aléatoirement, mais qu'elle a le focus, vous pouvez considérer que :
Toute fenêtre sans titre qui apparait en premier plan et qui correspond à tel ou tel point de repère comme le style par exemple sera considérée comme la fenêtre à traiter.
Mais attention, cela peut mener à bien des dysfonctionnement si plus d'une fenêtre correspond à ceci.
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 11:06
par Pelagos
Malheureusement je peux pas le gérer comme ça. La procedure du prototype inclue de nombreuses apparitions de fenètres, je peux pas lui dire ça, d'autant plus que beaucoup n'ont pas de titre (comme c'est un prototype, le logiciel a été programmé par un étudiant qui ne c'est pas fait c.... a nommer les fenètres).
La fenetre est un message d'erreur sans titre. Sa taille depends de l'erreur en question, qui peut etre pas mal de truc. L'ordinateur est en allemand, et une fois sur deux le message d'erreur est en Allemand, donc pour repérer des similitudes de mot c'est pas evident... Pour une raison que je ne comprends pas, le texte des fenetres n'est de toute manière jamais reconnu par AWI. Peut etre un probleme de Labview...
Est ce que se serait pas possible de gerer comme ca : fonction WinGetHandle de toute les fenetres utiles, et inclure un truc du genre "Si une nouvelle fenetre pope, lit le handle. Si le handle colle pas avec la liste de handle, Then ..." ? Par contre je vois pas trop comment coder un truc comme ça.
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 11:58
par scorp84
Bonjour Pelagos,
Si tu ne peux pas te baser sur le titre, le contenu du message d'erreur a-t-il un texte commun (ex : violation d'accès ou autre) ?
Si c'est le cas, tu peux peut être essayer ça :
Je vais essayer de faire des tests voir si Autoit l'accepte.
Amicalement.
BM
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 12:56
par Pelagos
Hum. J'avais essayer de faire un truc similaire avec le premier type d'erreur du logiciel. Celui la étant "fixe", il etait plus facile a résoudre. La detection de texte ne marchait pas, AWI ne detectait aucun texte (alors que bien sur, il existait.). Je pense que la gestion de fenetre de Labview est le probleme, toutefois, la fenetre avait toujours la meme taille, donc j'ai utilisé ce paramètre.
Dans le second cas le texte varie, en fonction du type d'erreur, et donc la taille de la fenetre. Sur il y a toujours le mot "erreur" dans la fenêtre (encore que suivant les changements de langue, pas toujours, mais très souvent diront nous) , mais je ne pense pas que ça va marcher.
Enfin, ca vaut le coup d'essayer, je teste et je te dis.
Merci du coup de main en tout cas.
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 14:20
par scorp84
Voici un bout de code qui te permettrait de faire un tableau avec les applis qui tournent avec le nombre d'instances :
► Afficher le texte
Code : Tout sélectionner
; Récupère la liste des fenêtres
$var = WinList()
;_ArrayDisplay($var, "VAR")
; Déclaration des variables
Dim $tab [1][2]
Dim $nb=0
Dim $ligne=1
; Parcours liste des fenêtres actives
For $i = 1 to $var[0][0]
; Recherche des fenêtres active avec un titre
If $var[$i][0] <> "" Then
If ($var[$i][0] <> "Program manager" AND $var[$i][0] <> "Démarrer") Then
; Récupère l'état de la fenêtre
$etat=WinGetState($var[$i][0])
; Récupère nom prg
$pid=WinGetProcess($var[$i][0], "")
$nom_prg=_ProcessGetName($pid)
$nom_prg=StringLeft($nom_prg,StringLen($nom_prg)-4)
$nom_prg=StringUpper($nom_prg)
;MsgBox(0,"Nom",$nom_prg)
; Recherche si prg déjà détecté
$recherche = _ArraySearch($tab, $nom_prg, 0, 0, 0, 1, 1)
If $recherche=-1 Then
; Redimension tab
ReDim $tab [$ligne+1][2]
; Création ligne
$tab[$ligne][0]=$nom_prg
$tab[$ligne][1]=1
$ligne=$ligne+1
Else
; Incrémentation ligne prg
$tab_val=$tab[$recherche][1]
$tab[$recherche][1]=$tab_val+1
EndIf
EndIf
EndIf
; Compte nb prog
$tab[0][0]=UBound($tab)-1
Next
; Affiche tab
_ArrayDisplay($tab, "TAB")
; Recherche prg en particulier
$prg_rech="explorer"
$prg_rech=@ScriptName
$prg_rech=StringUpper($prg_rech)
$tab_index = _ArraySearch($tab, $prg_rech, 0, 0, 0, 1, 1) ; Recherche dans colonne 1
If $tab_index=-1 Then
$prg_nb=0
Else
$prg_nb=$tab[$tab_index][1]
EndIf
If $prg_nb>1 Then MsgBox(0,"STOP","2 FOIS")
;MsgBox(0,$prg_rech,$prg_nb)
Si ton nombre d'appli est défini, tu fait tourner ce script quand tu n'as pas ta fenêtre pour le stocker dans un tableau en dur et après tu compares si ton total est différent entre ton tableau fixe et le réel.
C'est un peu tiré par les cheveux mais je ne trouve que ça comme solution pour l'instant pour ton cas
Je continue à chercher.
Amicalement.
BM
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 15:01
par Pelagos
J'avais envisagé une solution dans le genre, mais j'ai franchement pas le nivear pour programmé un truc du genre. Ben je teste et je te dis.
La detection de mot ne marche pas, c'est officiel.
Merci encore.
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 15:07
par scorp84
Fais moi un hijackthis (
http://www.clubic.com/telecharger-fiche ... kthis.html) de ta machine sur laquelle tourne ton robot et envoie le moi.
J'essayerai de voir si j'arrive à te faire quelque chose.
Amicalement.
BM
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 16:41
par Pelagos
Désolé, je peux pas faire ça. Je n'ai pas les droits requis sur l'ordi du prototype. L'installation de tout nouveau programme est reglementée au niveau du laboratoire.
Désolé.
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 20:46
par scorp84
Là, ça devient dur
Là, j'ai plus d'idée, désolé
Amicalement.
BM
Re: [...] Detection de fenêtre "polymorphe"
Posté : lun. 03 mai 2010 23:00
par Tlem
Aux vues du peux de possibilités de points de repères, je propose une dernière solution.
Le but est de surveiller les fenêtres popup et de rechercher si le handle parent
Si le handle parent est l'application en question, alors c'est sans doute la fenêtre du message d'erreur.

Re: [...] Detection de fenêtre "polymorphe"
Posté : mar. 04 mai 2010 09:51
par Pelagos
Pour Scorp84, merci, c'est pas grave, tu m'as deja bien aidé. L'idée de Tlem est bonne, je vais essayer de combiner ca avec ton script, ca devrai passer. Je teste et je vous tiens au jus.
Re: [...] Detection de fenêtre "polymorphe"
Posté : mer. 05 mai 2010 11:50
par scorp84
Bonjour,
Certains de mes scripts envoient après exécution un rapport par mail.
Dans ce rapport, je fais un tableau des fenêtres ouvertes et pour chacune j'ai l'application parente.
Vu que ta fenêtre est sans nom, peut être peux tu récupérer son handle avec le nom du programme.
Voici le code :
► Afficher le texte
Code : Tout sélectionner
RECUP PROGRAMMES ACTIFS - 2.24
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; Création tableau tmp
Dim $tmp_tab[1]
$var = WinList()
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
; Parcours liste des fenêtres actives
For $i = 1 to $var[0][0]
; Recherche des fenêtres active avec un titre
If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
If ($var[$i][0] <> "Program manager" AND $var[$i][0] <> "Démarrer") Then
; Récupère l'état de la fenêtre
$etat=WinGetState($var[$i][0])
if BitAnd($etat, 8) Then
$etat_active="X"
Else
$etat_active=""
EndIf
if BitAnd($etat, 32) Then
$etat_maxi="Plein écran"
Else
$etat_maxi="Réduite"
EndIf
; Récupère nom programme
$pid=WinGetProcess($var[$i][0], "")
$nom_prg=_ProcessGetName($pid)
$nom_prg=StringLeft($nom_prg,StringLen($nom_prg)-4)
$nom_prg=StringUpper($nom_prg)
$recherche = _ArraySearch($tmp_tab, $var[$i][0], 0, 0, 0, 1, 1)
; Mise en tableau
If $recherche=-1 Then
$tmp_index=_ArrayAdd($tmp_tab,$nom_prg & "," & $var[$i][0] & "," & $etat_active & "," &$etat_maxi & ",")
EndIf
EndIf
EndIf
Next
; Affiche le tableau tmp
;_ArrayDisplay($tmp_tab, "TAB TMP")
; Compte le nb de ligne du tab tmp
$tmp_nb_ligne=StringReplace($tmp_tab[1], ",", ",")
$tmp_nb_ligne=@extended+1
; Crée le tab final
Dim $tab[$tmp_index+1][$tmp_nb_ligne+1]
; Création du tableau final, ligne à ligne
For $ligne=1 to $tmp_index
; Création du tableau final, colonne par colonne
For $col=1 to $tmp_nb_ligne
; Action suivant colonne
Switch $col
; Première colonne
Case 1
$nb=StringInStr($tmp_tab[$ligne], ",")-1
$tab[$ligne][$col]=StringLeft ($tmp_tab[$ligne],$nb)
; Dernière colonne
Case $tmp_nb_ligne
$nb=StringInStr($tmp_tab[$ligne], ",",0, $tmp_nb_ligne-1)+1
$tab[$ligne][$col]=StringMid($tmp_tab[$ligne], $nb, StringLen($tmp_tab[$ligne])-1)
; Toutes les autres colonnes du tableau
Case Else
$nb1=StringInStr($tmp_tab[$ligne], ",",0, $col-1)+1
$nb2=StringInStr($tmp_tab[$ligne], ",",0, $col)-$nb1
;MsgBox(0,"nb", $tmp_tab[$ligne] & @LF & $col & " " & $nb1 & " " & $nb2)
$tab[$ligne][$col]=StringMid($tmp_tab[$ligne], $nb1, $nb2)
EndSwitch
;MsgBox(0,"Test","ligne=" & $ligne & " col=" & $col,1 & "=>" & $tab[$ligne][$col])
Next
Next
; Recherche programme particulier
$prg_rech="FIREFOX"
$prg_rech_index = _ArraySearch($tab, $prg_rech,0,0,0,1,1,1) ; Recherche dans colonne 1
If $prg_rech_index<>-1 Then
$tab[$prg_rech_index][5]=""
EndIf
; Recherche fenêtre particulière
$fen_rech="ASticky"
$fen_rech_index = _ArraySearch($tab, $fen_rech,0,0,0,1,1,2) ; Recherche dans colonne 2
If $fen_rech_index<>-1 Then
$tab[$fen_rech_index][5]=""
EndIf
; Tri le tab final
_ArraySort($tab, 0, 0, 0, 1)
; Affichage du tableau final
;_ArrayDisplay($tab, "TAB")
; Formatage tab
$tab_prg="<table width=""100%"" border=1 cellpadding=1 cellspacing=0 bordercolor=""#000000"">"
$tab_prg_police="<FONT face=""Verdana"" color=""#000000"" size=2>"
$tab_prg=$tab_prg & "<tr align=""center""><td>" & $tab_prg_police & "<b>PROGRAMME</b></font></td><td>" & $tab_prg_police & "<b>FENETRE</b></font></td><td>" & $tab_prg_police & " <b>ACT.</b> </font></td><td>" & $tab_prg_police & "<b>!</b></font></td></tr>"
For $lig_rapp=1 to $ligne-1
$tab_prg=$tab_prg & "<tr><td>" & $tab_prg_police & " " & $tab[$lig_rapp][1] & " </font></td><td>" & $tab_prg_police & " " & $tab[$lig_rapp][2] & " </font></td><td align=""center""> " & $tab_prg_police & " " & $tab[$lig_rapp][3] & " </font></td></td><td align=""center""> " & $tab_prg_police & " " & $tab[$lig_rapp][5] & " </font></td></tr>"
Next
$tab_prg=$tab_prg & "</table>"
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Le bout de code est sûrement perfectible mais j'espère qu'il pourra t'aider.
Amicalement.
BM
Re: [...] Detection de fenêtre "polymorphe"
Posté : ven. 07 mai 2010 21:56
par GMib
Je n'est pas bien compris ce qu'est AWI, mais certaine fenêtre son identifiable grâce a la class (voir AutoIt window info)
WinGetClassList pourrai peu être aider.
Re: [...] Detection de fenêtre "polymorphe"
Posté : dim. 09 mai 2010 22:48
par Tlem
GMib a écrit :Je n'est pas bien compris ce qu'est AWI
GMib a écrit :voir AutoIt Window Info

Re: [...] Detection de fenêtre "polymorphe"
Posté : dim. 09 mai 2010 22:52
par GMib
lol, ben voila, la j'ai compris

Re: [...] Detection de fenêtre "polymorphe"
Posté : mer. 12 mai 2010 11:45
par Pelagos
Bien, j'ai résolu le problème avec un "select...case" basé sur une gamme de taille de fenetre et le code de Scorp84. Finalement ça marche assez.
Bref, c'est long et lourd, mais ca marche pas mal. Donc bon.
Merci a tous.
Re: [...] Detection de fenêtre "polymorphe"
Posté : mer. 12 mai 2010 12:31
par Tlem
N'oubliez pas la balise [R] dans le titre de votre premier message si votre sujet est résolu.
Re: [R] Detection de fenêtre "polymorphe"
Posté : lun. 17 mai 2010 09:37
par Pelagos
Done !