[R] ControlFocus d'une sous fenétre d'une application externe

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
skoizer
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 26 sept. 2016 15:43
Status : Hors ligne

[R] ControlFocus d'une sous fenétre d'une application externe

#1

Message par skoizer »

bonjour a tous.
C'est la première fois que je poste sur ce forum. Merci de me dire si je ne suis pas assez clair dans mes explications.

je vous explique le contexte
J'ai une application qui ne peut être configurée que via son interface graphique.
Chaque fois qu'un utilisateur windows se connecte sur un ordinateur, il doit au moin etre configuré une et une seule fois.
J'au 350 PC et 500 users différent, cela fait trop de combinaison possible pour que je puisse le faire manuellement.

Cette application, c'est Citrix Receiver.
quand cette application se lance si il detecte que le login et password n'est pas mis et ouvre une nouvelle fenétre.
C'est cette derniére fenétre que je dois controler avec autoit.
Le login et password n'est lié qu'a l'ordinateur (et non pas a l'utilisateur :/)

J'avais deja réalisé un tel script avec une ancienne version de Citrix Program Neighborhood et cela fonctionnait tres bien.

Mon script autoit, arrive a detecté si celui ci n'a pas été deja configuré.
Si ce n'est pas le cas il fait ceci.
;lancement du client citrix receiver
If FileExists("C:\Program Files (x86)\Citrix\SelfServicePlugin\SelfService.exe") Then
    Run("""C:\Program Files (x86)\Citrix\SelfServicePlugin\SelfService.exe"" -showAppPicker")
   else
     exit
EndIf
$i = 1
;attente de l'ouverture de citrix receiver
do
   Sleep(50)
   $sText = WinGetTitle("[ACTIVE]")
   $sCitrixHandelMain = WinGetHandle("[ACTIVE]")
   $i = $i + 1
Until $sText = "Citrix Receiver" or $i = $maxi
if $i = $maxi then
   exit
endIf
Do
  $hwnd = _WinAPI_GetClassName(WinGetHandle("[ACTIVE]"))
  Sleep(50)
Until $hwnd = "#32770"
Sleep(200)
;#32770 nom de la classe de fenetre windows pour le login et mdp pour citrix receiver
;envoie des commandes clvier pour mettre le login et mdp pour citrix receiver
Send("fermeCitrix\" & $CleICA)
Send("{TAB}")
Send("Mot de passe a envoyer")
Send("{TAB}")
Send("{SPACE}")
Send("{TAB}")
Send("{ENTER}")
;Sleep(3000)
WinClose($sCitrixHandelMain, "")
Le probléme c'est que si l'utilisateur clique ailleurs pendant l'execution du programme, cela ne fonctionne pas. Je perd le focus
La fenêtre que je dois controler a comme classname #32770 , celle ci est une sous fenetre de mon programme principal.
Le classname de mon programme principal change tout le temps.
exemple
HwndWrapper[SelfService;main;60e58ea5-8f02-4b8b-a20b-f12202ec87]
ou
HwndWrapper[SelfService;main;3abe58ea-8f02-4b8b-a20b-8fcaf2f097c]
etc...

je n'arrive pas a dire a autoit de reprendre le controle de cette sous fenetre quand je perd la main.

ControlFocus("[CLASS:#32770]", "", "")
puis apres j'aurais mis ceci
WinWaitActive("[CLASS:#32770]")


auriez vous une idée ?
Modifié en dernier par skoizer le jeu. 29 sept. 2016 09:05, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: ControlFocus d'une sous fenétre d'une application externe

#2

Message par jguinch »

La configuration Citrix est automatisable sans passer par l'interface graphique.
Pour ton problème, il faut utiliser les fonctions ControlSend/ControlSetText au lieu de Send.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
skoizer
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 26 sept. 2016 15:43
Status : Hors ligne

Re: ControlFocus d'une sous fenétre d'une application externe

#3

Message par skoizer »

La configuration Citrix est automatisable sans passer par l'interface graphique. <-- Explique
J'ai réliasé des scripts pour une partie ( pour la migration suprimer l'ancien Program Neighborhood et réinstaller Citrix receier) instal avec avec les bons paramétres (ferme citrix, compte citrix machine etc..)
dans mon cas je ne pense pas pouvoir faire la totallité.
Je peux faire une partie automatisable. Mais le login et password c'est impossible.
Je suis dans un cadre de non maîtrise de la ferme citrix. J'ai des applications qui sont chez un de nos partenaire. Notre base utilisateur (Active directory) ne sont pas lié, et ne peuvent l'être.
Donc je ne peux pas faire du SSO :/
Et puis mon prestataire nous donne qu'un et un seul compte citrix par ordinateur.

je vais tester ControlSend/ControlSetText.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: ControlFocus d'une sous fenétre d'une application externe

#4

Message par jguinch »

Désolé, j'avais pas compris qu'il s'agissait du login/mdp que tu voulais entrer.
Du coup, je sais si c'est possible de l'automatiser autrement.
Tu peux toujours essayer de mettre une trace avant et après avoir entré le login/mdp pour voir où les informations sont stockées. Si ça se trouve, il suffira de recopier le fichier sur les autres postes. Pour la trace avant/après, j'utilise RegShot qui permet d'effectuer deux captures de la base de registre (et des répertoires voulus) et voir les différences.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
skoizer
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 26 sept. 2016 15:43
Status : Hors ligne

Re: ControlFocus d'une sous fenétre d'une application externe

#5

Message par skoizer »

j'ai bien regardé.. Tout est crypté et ne peut être copier/coller. Sinon ça serait une grosse faille de sécurité.
J'arrive bien a recuperer le compte citrix machine en base de registre
HKLM\SOFTWARE\Wow6432Node\Citrix\ICA Client\ClientName
mais le login citrix est totalement invisible :(
pour moi login citrix = compte citrix machine. donc je peu utiliser cette variable.
La seule chose qui me permet de savoir si citrix est configuré pour le compte client, c'est la présence de répertoire...
C:\Users\<user>\AppData\Local\Citrix\SelfService\img\
skoizer
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 26 sept. 2016 15:43
Status : Hors ligne

Re: ControlFocus d'une sous fenétre d'une application externe

#6

Message par skoizer »

sur la doc
; Définit le texte du contrôle d'édition du Bloc-notes. Le handle renvoyé par WinWait est utilisé pour le paramètre \"titre\" de ControlSetText.
ControlSetText($hWnd, "", "Edit1", "This is some text")
comment connaitre le nom du controle ou envoyé du texte ?
J'ai trouvé l'outil "autoit v3 Windows info"
si je prend le pointeur et que j'essaye de prendre la partie login ou password, je n'ai rien.
Je pense que l'outil cache le nom des controles. Je ne peut le faire quand ayant le Focus.
As tu une idée pour recuperer le focus d'une sous fenétre d'un programme la classname c'est #32770 ?

Edit :
J'ai trouvé mon probléme.
La classe name # 32770 est un nom générique. Il peut y en avoir d'autre...
finallement je fais une recherche sur le classname et le titre de la fenétre. je peux donc envoyé un send.
Do
      $hwnd = _WinAPI_GetClassName(WinGetHandle("[ACTIVE]"))
      Sleep(50)
      WinActivate("[CLASS:#32770]")
   Until $hwnd = "#32770" and WinGetTitle("[ACTIVE]") = "Citrix Receiver"
Répondre