pour mon 1er post, je vous fais part d'un script que j'ai développé dans le cadre professionnel et qui m'a ensuite fait gagner pas mal de temps...
Toutefois, je pense qu'il pourrait être grandement amélioré... si le cœur ou l'envie vous en dit, n'hésitez pas.
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.1.1.0
Authors: Fabrice LANG,
ResNullius : add dynamic search update
Script Function:
Recherche des produits installés sur le poste....
#ce ----------------------------------------------------------------------------
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
;Opt("TrayIconHide",1)
Global const $max_retour=255
Global const $NbrClef = 11
Dim $Install_Clef [$NbrClef] = ["","Publisher","DisplayName","DisplayVersion","VersionMajor","VersionMinor", _
"InstallLocation","InstallDate","UninstallString","LocalPackage","WindowsInstaller"]
Global const $idx_pos_DisplayName=2
Dim $Install_Val [$max_retour][$NbrClef]
Dim $Install_TreeView [$max_retour][$NbrClef]
Global $Install_Nbr
#include <GUIConstants.au3>
; == GUI generated with Koda ==
$LaBojte = GUICreate("Recherche d'installation", 528, 487, 247, 122)
$i_Chercher = GUICtrlCreateInput("AutoIt", 16, 8, 409, 21)
;$b_Chercher = GUICtrlCreateButton("Chercher", 432, 8, 89, 21, 0)
$b_Clear = GUICtrlCreateButton("Clear", 432, 8, 89, 21, 0)
$tv_Liste = GUICtrlCreateTreeView(8, 58, 513, 393, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS,$TVS_TRACKSELECT,$TVS_FULLROWSELECT), $WS_EX_CLIENTEDGE)
$b_Action = GUICtrlCreateButton("Action", 336, 456, 89, 25, 0)
$b_Quitter = GUICtrlCreateButton("Quitter", 432, 456, 89, 25, 0)
GUICtrlCreateLabel("This is a free software !", 3, 456, 320, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE))
$c_DisplayName = GUICtrlCreateCheckbox("DisplayName", 24, 34, 81, 17)
$c_Publisher = GUICtrlCreateCheckbox("Publisher", 128, 34, 65, 17)
$c_AutreClef = GUICtrlCreateCheckbox("Autre :", 224, 34, 48, 17)
$Cmb_AutreClef = GUICtrlCreateCombo("", 275, 32, 246, 21)
$tmp=$Install_Clef [1]
For $cpt1 = 2 to $NbrClef-1
$tmp = $tmp & "|" &$Install_Clef [$cpt1]
Next
GUICtrlSetData(-1, $tmp, $Install_Clef [1])
GUICtrlSetState($b_Action, $GUI_DISABLE)
;GUICtrlSetState($c_AutreClef, $GUI_CHECKED)
GUICtrlSetState($c_DisplayName, $GUI_CHECKED)
GUISetState(@SW_SHOW)
$c_OldText = GUICtrlRead($i_Chercher )
RempliTreeView()
GUICtrlSetState($i_Chercher,$GUI_FOCUS)
While 1
$c_Text = GUICtrlRead($i_Chercher )
If GUICtrlGetHandle("") = $i_Chercher then ControlSend($LaBojte,"",$i_Chercher,"{END}")
If $c_Text <> $c_OldText Then
If StringLen($c_Text) >= 1 then ; this number determines how many characters must be entered before the search starts; above 1 gives better responsiveness
RempliTreeView()
Else
If StringLen($c_Text) = 0 then Delete_TreeView()
EndIf
$c_OldText = $c_Text
EndIf
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE Or $msg = $b_Quitter
ExitLoop
;Case $msg = $b_Chercher
; RempliTreeView()
Case $msg = $b_Clear
GUICtrlSetData($i_Chercher,"")
GUICtrlSetState($i_Chercher,$GUI_FOCUS)
;RempliTreeView()
Delete_TreeView()
Case $msg = $b_Action
Action()
Case Else
$item = GUICtrlRead($tv_Liste) ; Get the controlID of the current selected treeview item
If $item <> 0 Then
$text = GUICtrlRead($item, 1) ; Get the text of the treeview item
If StringInStr( $text,"UninstallString") Or StringInStr( $text,"LocalPackage") Then
If GUICtrlRead($b_Action)<>"Desinstaller" Then
GUICtrlSetData($b_Action,"Desinstaller")
GUICtrlSetState($b_Action, $GUI_ENABLE)
EndIf
ElseIf StringInStr( $text,"InstallLocation") Then
If GUICtrlRead($b_Action)<>"Explorer" Then
GUICtrlSetData($b_Action,"Explorer")
GUICtrlSetState($b_Action, $GUI_ENABLE)
EndIf
ElseIf GUICtrlRead($b_Action)<>"Action" Then
GUICtrlSetData($b_Action,"Action")
GUICtrlSetState($b_Action, $GUI_DISABLE)
EndIf
EndIf ;;;;;;;
EndSelect
WEnd
Exit
Func Action()
Select
Case GUICtrlRead($b_Action) == "Desinstaller"
$text=GUICtrlRead(GUICtrlRead($tv_Liste),1)
$text=StringMid( $text, StringInStr($text,"=")+1)
;Opt("RunErrorsFatal", 0);1=fatal, 0=silent set @error
Run( $text )
If @error Then
MsgBox(16,"Erreur d'execution !","Une erreur fatale est rencontrée au lancement de la commande :" & @CRLF & @CRLF & "=> " & $text )
EndIf
;Opt("RunErrorsFatal", 1)
Case GUICtrlRead($b_Action) == "Explorer"
$text=GUICtrlRead(GUICtrlRead($tv_Liste),1)
$text=StringMid( $text, StringInStr($text,"=")+1)
If FileExists( $text ) Then
Run("explorer.exe " & $text)
Else
MsgBox(16,"Erreur !","Le répertoire indiqué n'existe pas :" & @CRLF & @CRLF & "=> " & $text )
EndIf
Case Else
EndSelect
EndFunc
Func RempliTreeView()
Delete_TreeView()
ControlSend($LaBojte,"",$i_Chercher,"{END}")
If GUICtrlRead($c_DisplayName ) = $GUI_CHECKED Then
Recherche_registre( "DisplayName",GUICtrlRead($i_Chercher ) )
Recherche_registre( "DisplayName",GUICtrlRead($i_Chercher ),"Uninstall" )
EndIf
If GUICtrlRead($c_Publisher ) = $GUI_CHECKED Then
Recherche_registre( "Publisher",GUICtrlRead($i_Chercher ) )
Recherche_registre( "Publisher",GUICtrlRead($i_Chercher ),"Uninstall" )
EndIf
If GUICtrlRead($c_AutreClef ) = $GUI_CHECKED Then
Recherche_registre( GUICtrlRead($cmb_AutreClef),GUICtrlRead($i_Chercher ) )
Recherche_registre( GUICtrlRead($cmb_AutreClef),GUICtrlRead($i_Chercher ),"Uninstall" )
EndIf
If $Install_Nbr >0 Then
For $cpt1 = 0 to $Install_Nbr-1
$Install_TreeView[$cpt1][0] = GUICtrlCreateTreeViewitem($Install_Val[$cpt1][0]& " ["& $Install_Val[$cpt1][2] &"]", $tv_Liste)
For $cpt2 = 1 to $NbrClef-1
If $Install_Val[$cpt1][$cpt2] <> "" Then
$Install_TreeView[$cpt1][$cpt2] = GUICtrlCreateTreeViewitem($Install_Clef [$cpt2] & "=" & $Install_Val[$cpt1][$cpt2], $Install_TreeView[$cpt1][0])
EndIf
Next
Next
EndIf
ControlSend($LaBojte,"",$i_Chercher,"{END}")
EndFunc
Func Delete_TreeView()
GUICtrlDelete ($tv_Liste)
ControlSend($LaBojte,"",$i_Chercher,"{END}")
For $cpt1 = 0 to $Install_Nbr-1
For $cpt2 = 1 to $NbrClef-1
If $Install_Val[$cpt1][$cpt2] <> "" Then
$Install_Val[$cpt1][$cpt2]=""
EndIf
Next
$Install_Val[$cpt1][0]=""
Next
$Install_Nbr = 0
$tv_Liste = GUICtrlCreateTreeView(8, 58, 513, 393, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS,$TVS_TRACKSELECT,$TVS_FULLROWSELECT), $WS_EX_CLIENTEDGE)
EndFunc
Func TabToString()
Local $Msg=""
For $cpt1 = 0 to $Install_Nbr-1
$Msg=$Msg & "[" & $Install_Val[$cpt1][0] & "]"
For $cpt2 = 1 to $NbrClef-1
If $Install_Val[$cpt1][$cpt2] <> "" Then
$Msg= $Msg & @CRLF & $Install_Clef [$cpt2] & "=" & $Install_Val[$cpt1][$cpt2]
EndIf
Next
$Msg=$Msg & @CRLF & @CRLF
Next
Return $Msg
EndFunc
Func Controle_Deja_Trouve( $a_chercher )
Local $Msg=""
For $cpt1 = 0 to $Install_Nbr-1
;- Généralement, la valeur se retouve en [8]... on essaie de gagner du temps si existe.
If StringInStr( $Install_Val[$cpt1][8], $a_chercher ) <> 0 Then Return True
For $cpt2 = 0 to $NbrClef-1
If StringInStr( $Install_Val[$cpt1][$cpt2], $a_chercher ) <> 0 Then
Return True
EndIf
Next
Next
Return False
EndFunc
;~ Recherche à partir de la base de registres des programmes installés.
;- ===================================================================
;- $Quoi : quelle clef doit-on controler ?
;- $Valeur : quelle valeur recherche-t'on ? (doit être au moins une sous-chaine)
;- $Ou : à partir d'où doit-on rechercher ? Par défaut, les produits installés par l'administrateur.
;~
;~ Exemples d'utilisation :
;- =======================
;~ Recherche_registre( "DisplayName","antivirus" )
;~ Recherche_registre( "DisplayName","liveupdate","Uninstall" )
;-
Func Recherche_registre( const $Quoi , const $Valeur, $Ou = "S-1-5-18" )
Local $i=0
Local $fini=0
Local $DisplayName=""
Local $SousClef="\"
Local $a_GuiPos = WinGetPos($LaBojte)
Local $a_CtrlPos = ControlGetPos($LaBojte,"",$tv_Liste)
Local $ToolTipX = $a_GuiPos[0]+$a_CtrlPos[0] + 60
Local $ToolTipY = $a_GuiPos[1]+$a_CtrlPos[1] + 60
ToolTip("Retreiving information...",$ToolTipX,$ToolTipY,"Please Wait")
Select
Case $Ou = "Uninstall"
; Information d'installation à rechercher dans la partie... UnInstall !
$Ou = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
Case Else
; Information d'installation à rechercher dans la partie des produits installés.
$Ou = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\" & $Ou & "\Products\"
$SousClef = "\InstallProperties"
EndSelect
Do
$i = $i + 1
Local $var = RegEnumKey($Ou, $i)
If @error Or $Install_Nbr >= $max_retour Then
$fini=True
If $Install_Nbr >= $max_retour Then
;MsgBox( 64,"Nombre maximal de recherche atteint","Il y a trop de correspondance... Seules les " & $max_retour & " premières sont présentées.",1)
ToolTip("")
Sleep(250)
ToolTip("Il y a trop de correspondance... Seules les " & $max_retour & " premières sont présentées.",$ToolTipX, $ToolTipY, "Nombre maximal de recherche atteint",1)
Sleep(1500)
ControlSend($LaBojte,"",$i_Chercher,"{END}")
EndIf
Else
$Product = RegRead($Ou & $var & $SousClef, $Quoi)
If StringInStr( $Product , $Valeur ) Then
If Controle_Deja_Trouve( $var ) = False Then
$Install_Val[$Install_Nbr][0] = $var
$Install_Clef[0] = $Quoi
For $cpt1 = 1 to ( $NbrClef - 1 )
$Install_Val[$Install_Nbr][$cpt1] = RegRead($Ou & $var & $SousClef, $Install_Clef[$cpt1] )
Next
$Install_Nbr = $Install_Nbr + 1
EndIf
EndIf
EndIf
Until $fini
ToolTip("")
Return $Install_Nbr
EndFunc