Page 1 sur 1

Click sur un bouton récalcitrant

Posté : mer. 02 déc. 2020 16:57
par vince
Bonjour,

je dois installer un logiciel en mode silencieux, mais celui-ci affiche un message malgré tout.
Donc je veux utiliser AutoIt pour cliquer sur le Bouton "OK" du message, mais j'ai tout essayé et cela ne fonctionne pas.

Voici le code ci-dessous.
J'ai essayé toutes les possibilités offertes par Send, ControlSend et ControlClick sans succès.
Pour vérification, j'ai récupéré le texte du bouton avec ControlGetText et ça retourne bien "OK".
Donc il n'y a pas d'erreur au niveau des $hWnd et $hdl.
Merci d'avance pour votre aide.
Local $hWnd = WinActivate("readme.wri")
If $hWnd Then
   
   WinWaitActive("readme.wri", "", 10)

   $hdl = ControlGetHandle($hWnd,"","[CLASS:Button; INSTANCE:1]")
   ControlFocus($hWnd,"",$hdl)
   
   Send("{ESC}")
   Send("{ENTER}")
   ControlSend($hWnd, "", "", "{ENTER}")
   ControlSend($hWnd, "", "", "{ESC}")
   ControlSend($hWnd, "", $hdl, "{ENTER}")
   ControlSend($hWnd, "", $hdl, "{ESC}")

   ControlClick($hWnd,"","[TEXT:OK]")
   ControlClick($hWnd,"","[CLASS:Button; INSTANCE:1]")
   ControlClick($hWnd,"",$hdl)

   
   $sText = ControlGetText($hWnd,"",$hdl)
   MsgBox(0, "", "Le texte dans Edit1 est: " & $sText) ; Affiche "OK"
   
EndIf

Re: Click sur un bouton récalcitrant

Posté : mer. 02 déc. 2020 21:33
par Tlem
Bonsoir.
Quelle est cette application mystérieuse qui ne peux être installée silencieusement ?
Avez vous essayé les commutateurs : /s ou /s ?

Re: Click sur un bouton récalcitrant

Posté : jeu. 03 déc. 2020 09:25
par vince
C'est KaleidaGraph 4.1, un vieux logiciel qui est encore utilisé à mon boulot.
J'utilise bien le commutateur /s et mis à part le message qui s'affiche, le reste de l'installation se fait bien de façon silencieuse.

Re: Click sur un bouton récalcitrant

Posté : jeu. 03 déc. 2020 10:53
par Tlem
Bonjour.
Utilisez l'outil AutoIt Windows Info pour voir les éléments de cette fenêtre. Faites nous une capture des deux fenêtres et on vous aidera au mieux.

Re: Click sur un bouton récalcitrant

Posté : mar. 08 déc. 2020 09:43
par vince
Bonjour,

désolé pour le délai de réponse.
Voici une capture du message récalcitrant :
msg.png
msg.png (6.42 Kio) Vu 2266 fois
Et une copie de ce qu'affiche AutoIt Windows Info :
>>>> Window <<<<
Title: C:\Program Files (x86)\KaleidaGraph 4.0\Readme.wri
Class: #32770
Position: 356, 350
Size: 562, 145
Style: 0x96C80284
ExStyle: 0x00010101
Handle: 0x00000000000A02CC

>>>> Control <<<<
Class: Button
Instance: 1
ClassnameNN: Button1
Name:
Advanced (Class): [CLASS:Button; INSTANCE:1]
ID:
Text: OK
Position: 478, 84
Size: 68, 23
ControlClick Coords: 30, 13
Style: 0x50000001
ExStyle: 0x00000000
Handle: 0x0000000000010424

>>>> Mouse <<<<
Position: 867, 473
Cursor ID: 0
Color: 0xE1E1E1

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
OK


>>>> Hidden Text <<<<

Re: Click sur un bouton récalcitrant

Posté : mar. 08 déc. 2020 12:03
par walkson
Bonjour,

Code : Tout sélectionner

$hnd = WinActivate("C:\Program Files (x86)\KaleidaGraph 4.0\Readme.wri","")
Sleep(1000)
ControlClick($hnd,"","Button1")
Après si cela ne fonctionne pas, la solution serait d'attribuer l’extension WRI à NotePad et de fermer celui-ci

Re: Click sur un bouton récalcitrant

Posté : mar. 08 déc. 2020 13:57
par Tlem
Bonjour.
Vous pouvez aussi essayer ces différentes possibilités :

Code : Tout sélectionner

ControlClick("[CLASS:#32770]", "","[CLASS:Button; INSTANCE:1]")

Code : Tout sélectionner

ControlClick("C:\Program Files (x86)\KaleidaGraph 4.0\Readme.wri", "","[CLASS:Button; INSTANCE:1]")

Code : Tout sélectionner

ControlClick("[REGEXPTITLE:(?i)(.*Readme.wri)]", "","[CLASS:Button; INSTANCE:1]")

Re: Click sur un bouton récalcitrant

Posté : mar. 08 déc. 2020 22:01
par mikell
Je pencherais pour la 1ère de ces 3 alternatives
Une fenêtre d'alerte #32770 est en général le résultat d'une manoeuvre précédente inappropriée...
Sinon il reste le très pratique WinKill("[CLASS:#32770]") :mrgreen:

Re: Click sur un bouton récalcitrant

Posté : mar. 15 déc. 2020 09:54
par vince
Bonjour,

j'ai essayé toutes vos propositions, même le kill et rien ne fonctionne sauf la solution d'attribuer l’extension WRI à NotePad.

Je trouve quand même bizarre qu'autoit ne puisse rien faire.

Re: Click sur un bouton récalcitrant

Posté : jeu. 17 déc. 2020 18:43
par walkson
Bonjour,
Peut être avec ProcessClose ( "process" )
Avec ce code produit par scriptomatic, vous récupérez tous les process avec leur PID, une simple recherche détermine le processus qui déclenche la fenêtre

Code : Tout sélectionner

;Généré par AutoIt ScriptOMatic

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"

$OutputTitle = ""
$Output = ""
$OutputTitle &= "Computer: " & $strComputer  & @CRLF
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
                                          $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

If IsObj($colItems) then
   Local $Object_Flag = 0
   For $objItem In $colItems
      $Object_Flag = 1
      $Output &= "Caption: " & $objItem.Caption & @CRLF
      $Output &= "CommandLine: " & $objItem.CommandLine & @CRLF
      $Output &= "CreationClassName: " & $objItem.CreationClassName & @CRLF
      $Output &= "CreationDate: " & WMIDateStringToDate($objItem.CreationDate) & @CRLF
      $Output &= "CSCreationClassName: " & $objItem.CSCreationClassName & @CRLF
      $Output &= "CSName: " & $objItem.CSName & @CRLF
      $Output &= "Description: " & $objItem.Description & @CRLF
      $Output &= "ExecutablePath: " & $objItem.ExecutablePath & @CRLF
      $Output &= "ExecutionState: " & $objItem.ExecutionState & @CRLF
      $Output &= "Handle: " & $objItem.Handle & @CRLF
      $Output &= "HandleCount: " & $objItem.HandleCount & @CRLF
      $Output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
      $Output &= "KernelModeTime: " & $objItem.KernelModeTime & @CRLF
      $Output &= "MaximumWorkingSetSize: " & $objItem.MaximumWorkingSetSize & @CRLF
      $Output &= "MinimumWorkingSetSize: " & $objItem.MinimumWorkingSetSize & @CRLF
      $Output &= "Name: " & $objItem.Name & @CRLF
      $Output &= "OSCreationClassName: " & $objItem.OSCreationClassName & @CRLF
      $Output &= "OSName: " & $objItem.OSName & @CRLF
      $Output &= "OtherOperationCount: " & $objItem.OtherOperationCount & @CRLF
      $Output &= "OtherTransferCount: " & $objItem.OtherTransferCount & @CRLF
      $Output &= "PageFaults: " & $objItem.PageFaults & @CRLF
      $Output &= "PageFileUsage: " & $objItem.PageFileUsage & @CRLF
      $Output &= "ParentProcessId: " & $objItem.ParentProcessId & @CRLF
      $Output &= "PeakPageFileUsage: " & $objItem.PeakPageFileUsage & @CRLF
      $Output &= "PeakVirtualSize: " & $objItem.PeakVirtualSize & @CRLF
      $Output &= "PeakWorkingSetSize: " & $objItem.PeakWorkingSetSize & @CRLF
      $Output &= "Priority: " & $objItem.Priority & @CRLF
      $Output &= "PrivatePageCount: " & $objItem.PrivatePageCount & @CRLF
      $Output &= "ProcessId: " & $objItem.ProcessId & @CRLF
      $Output &= "QuotaNonPagedPoolUsage: " & $objItem.QuotaNonPagedPoolUsage & @CRLF
      $Output &= "QuotaPagedPoolUsage: " & $objItem.QuotaPagedPoolUsage & @CRLF
      $Output &= "QuotaPeakNonPagedPoolUsage: " & $objItem.QuotaPeakNonPagedPoolUsage & @CRLF
      $Output &= "QuotaPeakPagedPoolUsage: " & $objItem.QuotaPeakPagedPoolUsage & @CRLF
      $Output &= "ReadOperationCount: " & $objItem.ReadOperationCount & @CRLF
      $Output &= "ReadTransferCount: " & $objItem.ReadTransferCount & @CRLF
      $Output &= "SessionId: " & $objItem.SessionId & @CRLF
      $Output &= "Status: " & $objItem.Status & @CRLF
      $Output &= "TerminationDate: " & WMIDateStringToDate($objItem.TerminationDate) & @CRLF
      $Output &= "ThreadCount: " & $objItem.ThreadCount & @CRLF
      $Output &= "UserModeTime: " & $objItem.UserModeTime & @CRLF
      $Output &= "VirtualSize: " & $objItem.VirtualSize & @CRLF
      $Output &= "WindowsVersion: " & $objItem.WindowsVersion & @CRLF
      $Output &= "WorkingSetSize: " & $objItem.WorkingSetSize & @CRLF
      $Output &= "WriteOperationCount: " & $objItem.WriteOperationCount & @CRLF
      $Output &= "WriteTransferCount: " & $objItem.WriteTransferCount & @CRLF
   Next
  If $Object_Flag = 0 Then Msgbox(1,"Sortie WMI",$OutputTitle)
   ConsoleWrite($Output)
   FileWrite(@TempDir & "\Win32_Process.TXT", $Output )
   Run(@Comspec & " /c start " & @TempDir & "\Win32_Process.TXT" )
Else
   Msgbox(0,"Sortie WMI","Aucun objets WMI trouvés pour la Classe :" & "Win32_Process" )
Endif


Func WMIDateStringToDate($dtmDate)
	Return (StringMid($dtmDate, 5, 2) & "/" & _
	StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
	& " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc


J'ai créé une extension bidon pour afficher la fenêtre "#32770", le résultat du code me donne
Caption: rundll32.exe
CommandLine: "C:\Windows\system32\rundll32.exe" C:\Windows\system32\shell32.dll,OpenAs_RunDLL C:\Users\PC\Desktop\Nouveau document texte.popo
CreationClassName: Win32_Process
CreationDate: 12/17/2020 17:51:40
CSCreationClassName: Win32_ComputerSystem
Description: rundll32.exe
ExecutablePath: C:\Windows\system32\rundll32.exe
ExecutionState:
Handle: 2628
.....
Ayant le PID, je suis sûr de fermer le bon processus