31290 Posted May 29, 2018 Posted May 29, 2018 Hi everyone, I'm currently writing a script that allow me to list all currently installed software on a computer but some of the are listed in the HKLM64 hive of the registry whereas 95% of all others are in the HKLM "normal" one. Thing is, I'd like to combine these two reg key into one single ListView item. Here's my code so far, knowing that it's working on both cases (changing to HKLM64 or HKLM short) Spoiler expandcollapse popup#include <GuiListView.au3> Opt("TrayAutoPause", 0) Opt('GUIOnEventMode', 1) Opt('GUICloseOnEsc' , 1) Global $i Local $sSft Global $sGui = GUICreate('Currently Installed Software', 810, 650, -1, -1) Global $sLvw = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600) _ComputerGetSoftware($sSft) For $i = 1 To ubound($sSft) - 1 GUICtrlCreateListViewItem($i & '|' & $sSft[$i][0] & '|' & $sSft[$i][1] & '|' & $sSft[$i][2] & '|' & $sSft[$i][3], $sLvw) Next GUICtrlSendMsg($sLvw, 0x101E, 1, 175) GUICtrlSendMsg($sLvw, 0x101E, 2, 65) GUICtrlSendMsg($sLvw, 0x101E, 3, 150) GUICtrlSendMsg($sLvw, 0x101E, 4, 350) Local $mMen = GUICtrlCreateContextMenu($sLvw) Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen) GUICtrlSetOnEvent($Uninstall, '_Uninstall') Local $exp = GUICtrlCreateButton(' Expand ', 720, 615) GUICtrlSetOnEvent($exp, '_Expand') GUISetOnEvent(-3, '_AllExit') GUISetState(@SW_SHOW, $sGui) While 1 Sleep(10) WEnd ; Func _AllExit() GUIDelete($sGui) Exit EndFunc Func _Uninstall() Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1) If $proc[1] == 0 Then Return -1 ShellExecuteWait ($proc[5]) EndFunc Func _ComputerGetSoftware(ByRef $aSoftwareInfo) Local Const $UnInstKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Local $i = 1 Dim $aSoftwareInfo[1][4] For $j = 1 To 500 $AppKey = RegEnumKey($UnInstKey, $j) If @error <> 0 Then Exitloop If RegRead($UnInstKey & "\" & $AppKey, "DisplayName") = '' Then ContinueLoop ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4] $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3) $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3) $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3) $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3) $i = $i + 1 Next $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1 If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0) Return _ArraySort($aSoftwareInfo,0,1) For $j = 1 To 500 $AppKey = RegEnumKey($UnInstKey, $j) If @error <> 0 Then Exitloop $Reg = RegRead($UnInstKey & "\" & $AppKey, "DisplayName") $string = stringinstr($Reg, $input) If $string = 0 Then Continueloop ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4] $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3) $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3) $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3) $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3) $i = $i + 1 Next $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1 If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0) Return _ArraySort($aSoftwareInfo,0,1) EndFunc ; Func _Expand() _GUICtrlListView_SetColumnWidth($sLvw, 1, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 2, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 3, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 4, $LVSCW_AUTOSIZE) EndFunc Thanks in advance for the help -31290- ~~~ Doom Shall Never Die, Only The Players ~~~
Earthshine Posted May 29, 2018 Posted May 29, 2018 (edited) change your function that reads the reg. pass it the key once for 32 bit, once for 64 in main loop Func _ComputerGetSoftware(ByRef $aSoftwareInfo, $UnInstKey) then don;t do this, remark that out. Local Const $UnInstKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" pass that key to your function 2 times, 32 and 64 values and add them to the one array. Edited May 29, 2018 by Earthshine 31290 1 My resources are limited. You must ask the right questions
Earthshine Posted May 29, 2018 Posted May 29, 2018 by the way, your code doesn't compile so i'm not going to test it. My resources are limited. You must ask the right questions
31290 Posted May 29, 2018 Author Posted May 29, 2018 12 minutes ago, Earthshine said: by the way, your code doesn't compile so i'm not going to test it. What do you mean by that? I've just compiled it and ran just fine. Thanks for your info above, I'll test that. -31290- ~~~ Doom Shall Never Die, Only The Players ~~~
Subz Posted May 29, 2018 Posted May 29, 2018 Maybe something like: expandcollapse popup#include <GuiListView.au3> Opt("TrayAutoPause", 0) Opt('GUIOnEventMode', 1) Opt('GUICloseOnEsc' , 1) Global $aSoftwareInfo[0][5] _SoftwareInfo("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") _SoftwareInfo("HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") Global $hGui = GUICreate('Currently Installed Software', 810, 650, -1, -1) Global $idListView = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600) _GUICtrlListView_AddArray($idListView, $aSoftwareInfo) GUICtrlSendMsg($idListView, 0x101E, 1, 175) GUICtrlSendMsg($idListView, 0x101E, 2, 65) GUICtrlSendMsg($idListView, 0x101E, 3, 150) GUICtrlSendMsg($idListView, 0x101E, 4, 350) Local $mMen = GUICtrlCreateContextMenu($idListView) Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen) GUICtrlSetOnEvent($Uninstall, '_Uninstall') Local $exp = GUICtrlCreateButton(' Expand ', 720, 615) GUICtrlSetOnEvent($exp, '_Expand') GUISetOnEvent(-3, '_AllExit') GUISetState(@SW_SHOW, $hGui) While 1 Sleep(10) WEnd ; Func _AllExit() GUIDelete($hGui) Exit EndFunc Func _Uninstall() Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($idListView)), '|', 1) If $proc[1] == 0 Then Return -1 ShellExecuteWait ($proc[5]) EndFunc Func _SoftwareInfo($_sHKLMUninstall) Local $i = 1 While 1 $sRegKey = RegEnumKey($_sHKLMUninstall, $i) If @error Then Exitloop If RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName") = '' Then $i += 1 ContinueLoop EndIf $sDisplayName = StringStripWS(StringReplace(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName"), " (remove only)", ""), 3) $sDisplayVersion = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayVersion"), 3) $sPublisher = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "Publisher"), 3) $sUninstallString = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "UninstallString"), 3) _ArrayAdd($aSoftwareInfo, "|" & $sDisplayName & "|" & $sDisplayVersion & "|" & $sPublisher & "|" & $sUninstallString) $i += 1 WEnd _ArraySort($aSoftwareInfo,0,1) For $i = 0 To UBound($aSoftwareInfo) - 1 $aSoftwareInfo[$i][0] = $i Next EndFunc ; Func _Expand() _GUICtrlListView_SetColumnWidth($idListView, 1, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 2, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 3, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 4, $LVSCW_AUTOSIZE) EndFunc 31290, Earthshine and Trong 1 2
Trong Posted May 29, 2018 Posted May 29, 2018 (edited) "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" AutoItScript List installed programs and system information: expandcollapse popup#include <GuiListView.au3> Opt("TrayAutoPause", 0) Opt('GUIOnEventMode', 1) Opt('GUICloseOnEsc', 1) ;Opt("MustDeclareVars", 1) ; Global $SoftwList = 'ALL', $iAskSoftName = 0, $sSft[1][0] Global $sGui = GUICreate('Currently Installed Software', 810, 650, -1, -1) Global $sLvw = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600) _ComputerGetSoftware($sSft) For $i = 1 To UBound($sSft) - 1 GUICtrlCreateListViewItem($i & '|' & $sSft[$i][0] & '|' & $sSft[$i][1] & '|' & $sSft[$i][2] & '|' & $sSft[$i][3], $sLvw) Next GUICtrlSendMsg($sLvw, 0x101E, 1, 175) GUICtrlSendMsg($sLvw, 0x101E, 2, 65) GUICtrlSendMsg($sLvw, 0x101E, 3, 150) GUICtrlSendMsg($sLvw, 0x101E, 4, 350) Global $mMen = GUICtrlCreateContextMenu($sLvw) Global $CopI = GUICtrlCreateMenuItem('Uninstall Current Selection', $mMen) GUICtrlSetOnEvent($CopI, '_Uninstall') Global $exp = GUICtrlCreateButton(' Expand ', 720, 615) GUICtrlSetOnEvent($exp, '_Expand') GUISetOnEvent(-3, '_AllExit') GUISetState(@SW_SHOW, $sGui) ; While 1 Sleep(10) WEnd ; Func _AllExit() GUIDelete($sGui) Exit EndFunc ;==>_AllExit ; Func _Uninstall() Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1) If $proc[1] == 0 Then Return -1 If $proc[5] Then RunWait($proc[5]) Exit EndFunc ;==>_Uninstall ; Func _Copy2Clip() Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1) If $proc[1] == 0 Then Return -1 If $proc[5] Then ClipPut($proc[5]) EndFunc ;==>_Copy2Clip ; ; Author JSThePatriot - Modified June 20, 2010 by ripdad - Modified 2018/29/05 by Dao Van Trong - Trong.LIVE Func _ComputerGetSoftware(ByRef $aSoftwareInfo) Local Const $UnInstKey = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Local $i = 1, $Reg, $string, $AppKey ReDim $aSoftwareInfo[1][4] If ($iAskSoftName) Then $SoftwList = InputBox("Which Software", "You are running " & @OSVersion & " " & @OSArch & @CRLF & @CRLF & "Which Software would you like to view?", 'ALL') If @error = 1 Then Exit If $SoftwList = 'ALL' Then For $j = 1 To 500 $AppKey = RegEnumKey($UnInstKey, $j) If @error <> 0 Then ExitLoop If RegRead($UnInstKey & "\" & $AppKey, "DisplayName") = '' Then ContinueLoop ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4] $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3) $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3) $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3) $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3) $i = $i + 1 Next $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1 If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0) Return _ArraySort($aSoftwareInfo, 0, 1) Else For $j = 1 To 500 $AppKey = RegEnumKey($UnInstKey, $j) If @error <> 0 Then ExitLoop Local $Reg = RegRead($UnInstKey & "\" & $AppKey, "DisplayName") $string = StringInStr($Reg, $SoftwList) If $string = 0 Then ContinueLoop ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4] $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3) $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3) $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3) $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3) $i = $i + 1 Next $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1 If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0) Return _ArraySort($aSoftwareInfo, 0, 1) EndIf EndFunc ;==>_ComputerGetSoftware ; Func _Expand() _GUICtrlListView_SetColumnWidth($sLvw, 1, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 2, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 3, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($sLvw, 4, $LVSCW_AUTOSIZE) EndFunc ;==>_Expand Edited May 29, 2018 by VIP ; 31290 1 Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal
Earthshine Posted May 29, 2018 Posted May 29, 2018 look at subz example 31290 1 My resources are limited. You must ask the right questions
31290 Posted May 29, 2018 Author Posted May 29, 2018 (edited) @VIP > Thanks for your input but I was talking about combining HKLM64 & HKLM @Subz > Your example is just what I've expected! thanks a lot. Now I can figure out how to achieve that! @Earthshine > Thanks again for your help! Edited May 29, 2018 by 31290 ~~~ Doom Shall Never Die, Only The Players ~~~
Trong Posted May 29, 2018 Posted May 29, 2018 You can not combine it! You need to read or write it 2 times! For examples (List installed programs) just add "64" is enough! Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal
31290 Posted May 29, 2018 Author Posted May 29, 2018 1 minute ago, VIP said: You can not combine it! You need to read or write it 2 times! For examples (List installed programs) just add "64" is enough! Here I meant combining the 2 reg. keys in the same array But no worries, question has been answered by subz and I can go on with the tool I'm writing ~~~ Doom Shall Never Die, Only The Players ~~~
31290 Posted May 31, 2018 Author Posted May 31, 2018 @Subz and others Sorry to bother again but I need you help again. I'm now facing another thing which is that I cannot retrieve the uninstall key string. I just don't understand why my _Uninstall() function is not working: Func _Uninstall() Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($idListView)), '|', 1) If $proc[1] == 0 Then Return -1 Msgbox (0, "", $proc[5]) EndFunc Nothing simply happens. When displaying the $proc array, I just have two values, 0 & 1 :/ Then main goal here is to retrieve the uninstall sting displayed in the ListView. Full code so far: Spoiler expandcollapse popup#include <GuiListView.au3> Opt("TrayAutoPause", 0) Opt('GUIOnEventMode', 1) Opt('GUICloseOnEsc' , 1) Global $aSoftwareInfo[0][5] _SoftwareInfo("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") _SoftwareInfo("HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") Global $hGui = GUICreate('Currently Installed Software', 810, 650, -1, -1) Global $idListView = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600) _GUICtrlListView_AddArray($idListView, $aSoftwareInfo) GUICtrlSendMsg($idListView, 0x101E, 1, 175) GUICtrlSendMsg($idListView, 0x101E, 2, 65) GUICtrlSendMsg($idListView, 0x101E, 3, 150) GUICtrlSendMsg($idListView, 0x101E, 4, 350) Local $mMen = GUICtrlCreateContextMenu($idListView) Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen) GUICtrlSetOnEvent($Uninstall, '_Uninstall') Local $exp = GUICtrlCreateButton(' Expand ', 720, 615) GUICtrlSetOnEvent($exp, '_Expand') GUISetOnEvent(-3, '_AllExit') GUISetState(@SW_SHOW, $hGui) While 1 Sleep(10) WEnd ; Func _AllExit() GUIDelete($hGui) Exit EndFunc Func _Uninstall() Local $proc = StringSplit((GUICtrlRead($aSoftwareInfo)), '|', 1) _arraydisplay ($proc) ; Msgbox (0, "", $proc[5]) EndFunc Func _SoftwareInfo($_sHKLMUninstall) Local $i = 1 While 1 $sRegKey = RegEnumKey($_sHKLMUninstall, $i) If @error Then Exitloop If RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName") = '' Then $i += 1 ContinueLoop EndIf $sDisplayName = StringStripWS(StringReplace(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName"), " (remove only)", ""), 3) $sDisplayVersion = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayVersion"), 3) $sPublisher = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "Publisher"), 3) $sUninstallString = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "UninstallString"), 3) _ArrayAdd($aSoftwareInfo, "|" & $sDisplayName & "|" & $sDisplayVersion & "|" & $sPublisher & "|" & $sUninstallString) $i += 1 WEnd _ArraySort($aSoftwareInfo,0,1) For $i = 0 To UBound($aSoftwareInfo) - 1 $aSoftwareInfo[$i][0] = $i Next EndFunc ; Func _Expand() _GUICtrlListView_SetColumnWidth($idListView, 1, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 2, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 3, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($idListView, 4, $LVSCW_AUTOSIZE) EndFunc Thanks in advance -31290- ~~~ Doom Shall Never Die, Only The Players ~~~
Subz Posted May 31, 2018 Posted May 31, 2018 I've never used that method, I've always used something like: Func _Uninstall() Local $sUninstallString = _GUICtrlListView_GetItemText($idListView, _GUICtrlListView_GetSelectionMark($idListView), 4) If StringStripWS($sUninstallString, 8) = "" Then Return -1 Return $sUninstallString EndFunc 31290 1
31290 Posted May 31, 2018 Author Posted May 31, 2018 Well, thanks again Subz. I was beginning playing around with _GUICtrlListView_XXX functions. But yours is faster and efficient. You have a good day Sir ~~~ Doom Shall Never Die, Only The Players ~~~
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now