Что нового

Получение названия установленной программы в окне

Albarut

Новичок
Сообщения
4
Репутация
0
Перед установкой новых версий ПО удаляю предыдущие. Дохожу до окна "Установка и удаление программ", попадаю на первый элемент списка установленных программ. Не могу получить в качестве переменной текст окна (либо часть теста). Может кто поскажет КАК.


Добавлено:
Сообщение автоматически объединено:

Забыл прилепить исходный листинг:
Код:
;---------- Удаление старых версий ------------------
dim $n
Send("^{Esc}")   ; открыть "Пуск"
Send("+{LCtrl}")
Send("{TAB}")
Send("!а")
Send("!а")
WinWaitActive("Панель управления","")
$i = 1
Do
    Send("{DOWN}")
	$n=ControlListView ("Панель управления","","[CLASS:SysListView32; INSTANCE:1]","GetText",$i,0 )
	if $n="Установка и удаление программ" then 
		$i=999		 
	EndIf    
	$i = $i + 1
Until $i = 1000

Send("{ENTER}")
WinWaitActive("Установка и удаление программ","")
WinClose ("Панель управления","") 
Sleep (4000)

$n=;???????????????????????????????????????????

MsgBox(0, "!!!!!!", $n)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Albarut [?]
Забыл прилепить исходный листинг:
не только. еще бы не помешало заключить его в соответствующий тэг
autoit.gif
 
Автор
A

Albarut

Новичок
Сообщения
4
Репутация
0
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Извиняйте,.. жара, клин в башке.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Пример получения списка программ из реестра.
Может подойдет?

Код:
$reg = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall"
$i = 1
While 1
    Sleep(100)
    $var1 = RegEnumKey($reg, $i)
	If @error <> 0 then ExitLoop    
	$var2 = RegRead($reg & "\" & $var1, "DisplayName")
	If $var2 <> "" Then
	ConsoleWrite($var2 & @CRLF)
	EndIf	
	$i = $i + 1
WEnd
 
Автор
A

Albarut

Новичок
Сообщения
4
Репутация
0
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Спасибо, Yuriy! Вещь хорошая, только из нее невозможно перейти к удалению найденой старой версии. Покумекаю, может быть с этого хода можно решить задачу.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Albarut
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, UninstallString
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Получение названия установленной программы в окне \"Установка и удаление программ

Albarut
Можно так попробовать:
Код:
#include <WinAPIEx.au3>
#include <Array.au3>

$j = 0
$sKey = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
$Count = _WinAPI_RegQueryInfoKey($hKey)
Dim $aKey[$Count[0]]
Dim $aProgram[1][3]
For $i = 0 To UBound($aKey) - 1
	If RegRead($sKey & _WinAPI_RegEnumKey($hKey, $i), 'DisplayName') And _
			RegRead($sKey & _WinAPI_RegEnumKey($hKey, $i), 'UninstallString') Then
		ReDim $aProgram[UBound($aProgram) + 1][3]
		$aProgram[$j + 1][0] = RegRead($sKey & _WinAPI_RegEnumKey($hKey, $i), 'DisplayName')
		$aProgram[$j + 1][1] = RegRead($sKey & _WinAPI_RegEnumKey($hKey, $i), 'DisplayVersion')
		$aProgram[$j + 1][2] = RegRead($sKey & _WinAPI_RegEnumKey($hKey, $i), 'UninstallString')
		$aProgram[0][0] = UBound($aProgram) - 1
		$j += 1
	EndIf
Next
_WinAPI_RegCloseKey($hKey)
_ArrayDisplay($aProgram)
WinAPIEx
PS
Окно Установка и удаление программ можно так открыть:
Код:
Run(@ComSpec & ' /C appwiz.cpl', '', @SW_HIDE)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Получение названия установленной программы в окне \\\"Установка и удаление программ

madmasles сказал(а):
Albarut
Можно так попробовать...

Хороший и быстрый пример.



Добавлено:
Сообщение автоматически объединено:

Для полного счачтья можно еще заменить RegRead() на _WinAPI_RegQueryValue().
 
Автор
A

Albarut

Новичок
Сообщения
4
Репутация
0
Низкий поклон madmasles! Всё замечательно работает!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Это замечание тут неуместно, там просто опечатка, если присмотреться, буква «ч» расположена рядом с буквой «с» ;)

[?]
Можно так попробовать
А зачем повторять вызов _WinAPI_RegEnumKey?

Код:
#include <WinAPIEx.au3>
#include <Array.au3>

$sKey = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
$Count = _WinAPI_RegQueryInfoKey($hKey)

Dim $aKey[$Count[0]]
Dim $aProgram[$Count[0]+1][3]

For $i = 0 To UBound($aKey) - 1
	$s_Key = $sKey & _WinAPI_RegEnumKey($hKey, $i)
	$sDisplayName = RegRead($s_Key, 'DisplayName')
	$sDisplayVersion = RegRead($s_Key, 'DisplayVersion')
	$sUninstallString = RegRead($s_Key, 'UninstallString')
	
    If $sDisplayName And $sUninstallString Then
        $aProgram[0][0] += 1
        $aProgram[$aProgram[0][0]][0] = $sDisplayName
        $aProgram[$aProgram[0][0]][1] = $sDisplayVersion
        $aProgram[$aProgram[0][0]][2] = $sUninstallString
    EndIf
Next

ReDim $aProgram[$aProgram[0][0]+1][3]

_WinAPI_RegCloseKey($hKey)
_ArrayDisplay($aProgram)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Вы не могли бы пример с _WinAPI_RegQueryValue() в цикле привести, а то у меня никак не получается в скрипт ее вставить.

Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

$tData = DllStructCreate('wchar[1024]')
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
$Count = _WinAPI_RegQueryInfoKey($hKey)
Dim $aApp[$Count[0] + 1][4] = [[1]]
For $i = 0 To $Count[0] - 1
	$hSubKey = _WinAPI_RegOpenKey($hKey, _WinAPI_RegEnumKey($hKey, $i))
	Do
		If _WinAPI_RegQueryValue($hSubKey, 'DisplayName', $tData) Then
			$aApp[$aApp[0][0]][0] = DllStructGetData($tData, 1)
		Else
			ExitLoop
		EndIf
		If _WinAPI_RegQueryValue($hSubKey, 'UninstallString', $tData) Then
			$aApp[$aApp[0][0]][2] = DllStructGetData($tData, 1)
		Else
			ExitLoop
		EndIf
		If _WinAPI_RegQueryValue($hSubKey, 'DisplayVersion', $tData) Then
			$aApp[$aApp[0][0]][1] = DllStructGetData($tData, 1)
		Else
			$aApp[$aApp[0][0]][1] = ''
		EndIf

		; etc.

		$aApp[0][0] += 1
	Until 1
	_WinAPI_RegCloseKey($hSubKey)
Next
_WinAPI_RegCloseKey($hKey)
ReDim $aApp[$aApp[0][0]][4]
$aApp[0][0] -= 1

_ArrayDisplay($aApp)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
OffTopic:
CreatoR [?]
Это замечание тут неуместно
Yashied,
Это была шутка, может быть, неуместная. Приношу Вам свои извинения. :-[

Функции из библиотеки WinAPIEx, при работе с реестром, дают увеличение скорости (у меня) ~ в 80 раз, по сравнению со штатными функциями. Обалдеть!
 

glax24

Знающий
Сообщения
72
Репутация
14
При запуске примера от CreatoR на WIN7 x64 в список не попадают программы установленные с разрядностью х64.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
glax24
используй в примере ветку
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

нашел другой пример вывода списка
Код:
#Include <Array.au3>
Dim  $aSoftwareInfo
_ComputerGetSoftware($aSoftwareInfo)
_ArrayDisplay($aSoftwareInfo)

Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
	Local Const $UnInstKey	= "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
	Local $i = 1
	Dim $aSoftwareInfo[1][4]

	While 1
		$AppKey	= RegEnumKey($UnInstKey, $i)
		If @error <> 0 Then ExitLoop
		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 += 1
	WEnd

	$aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
	If $aSoftwareInfo[0][0] < 1 Then
		SetError(1, 1, 0)
	EndIf
EndFunc
 

glax24

Знающий
Сообщения
72
Репутация
14
joiner, надо компилировать скрипт под 2 версии х32 и х64. И на Winx64 проверять 2 ветки.
В х64 версии скрипта при проверки ветки
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
будет возвращен список установленных программ х64
и при проверки ветки
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
будет возвращен список установленных программ х32.
В случае запуска версии скрипта х32 на Winx64 результат возврата будет одинаковым, список установленных программ х32. Т.к. идет перенаправление ветки
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
в
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

И для полной картины установленных программ надо проверять еще ветку
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
указать какая система можно в самом скрипте. то есть согласно справке : HKLM64
 

glax24

Знающий
Сообщения
72
Репутация
14
HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall
результат возвращался пустой
Не пробовал, может надо было использовать
Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
glax24

Можно как-то так:
Код:
If @OSArch = 'x64' Then
	Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
	Global $Path2 = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
	Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
Else
	Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
	Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
EndIf

Но вот как это реализовать...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#Include <Array.au3>

Dim  $aSoftwareInfo
Dim  $aSoftwareInfo64
Dim  $aSoftwareInfo_all
_ComputerGetSoftware($aSoftwareInfo)
_ComputerGetSoftware64($aSoftwareInfo64)
_ComputerGetSoftware_all($aSoftwareInfo_all)

If @OSArch = "X86" Then
    _ArrayDisplay($aSoftwareInfo,'X86')
	_ArrayDisplay($aSoftwareInfo_all)
    Exit
    Else
_ArrayDisplay($aSoftwareInfo,'X86')
_ArrayDisplay($aSoftwareInfo64,'X64')
_ArrayDisplay($aSoftwareInfo_all)
EndIf

Func _ComputerGetSoftware64(ByRef $aSoftwareInfo64)
    Local Const $UnInstKey64  = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1
    Dim $aSoftwareInfo64[1][4]
    While 1
        $AppKey64 = RegEnumKey($UnInstKey64, $i)
        If @error <> 0 Then ExitLoop
        ReDim $aSoftwareInfo64[UBound($aSoftwareInfo64) + 1][4]
        $aSoftwareInfo64[$i][0]   = StringStripWS(StringReplace(RegRead($UnInstKey64 & "\" & $AppKey64, "DisplayName"), " (remove only)", ""), 3)
        $aSoftwareInfo64[$i][1]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "DisplayVersion"), 3)
        $aSoftwareInfo64[$i][2]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "Publisher"), 3)
        $aSoftwareInfo64[$i][3]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "UninstallString"), 3)
        $i += 1
    WEnd
    $aSoftwareInfo64[0][0] = UBound($aSoftwareInfo64, 1) - 1
    If $aSoftwareInfo64[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc

Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
    Local Const $UnInstKey  = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1
    Dim $aSoftwareInfo[1][4]
    While 1
        $AppKey = RegEnumKey($UnInstKey, $i)
        If @error <> 0 Then ExitLoop
        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 += 1
    WEnd
    $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
    If $aSoftwareInfo[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc

Func _ComputerGetSoftware_all(ByRef $aSoftwareInfo_all)
    Local Const $UnInstKey_all  = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Local $i = 1
    Dim $aSoftwareInfo_all[1][4]
    While 1
        $AppKey_all= RegEnumKey($UnInstKey_all, $i)
        If @error <> 0 Then ExitLoop
        ReDim $aSoftwareInfo_all[UBound($aSoftwareInfo_all) + 1][4]
        $aSoftwareInfo_all[$i][0]   = StringStripWS(StringReplace(RegRead($UnInstKey_all & "\" & $AppKey_all, "DisplayName"), " (remove only)", ""), 3)
        $aSoftwareInfo_all[$i][1]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "DisplayVersion"), 3)
        $aSoftwareInfo_all[$i][2]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "Publisher"), 3)
        $aSoftwareInfo_all[$i][3]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "UninstallString"), 3)
        $i += 1
    WEnd
    $aSoftwareInfo_all[0][0] = UBound($aSoftwareInfo_all, 1) - 1
    If $aSoftwareInfo_all[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc
 
Верх