Автор Тема: Получение названия установленной программы в окне  (Прочитано 15775 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Albarut [?]

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


Добавлено: Июль 22, 2010, 12:33:57
Забыл прилепить исходный листинг:
Код: AutoIt [Выделить]
;---------- Удаление старых версий ------------------
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)

« Последнее редактирование: Июль 22, 2010, 16:59:46 от Yashied »

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Albarut  [?]
Цитировать
Забыл прилепить исходный листинг:
не только. еще бы не помешало заключить его в соответствующий тэг
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн Albarut [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
    • Награды
Извиняйте,.. жара, клин в башке.

Оффлайн Yuriy [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 737
  • Репутация: 281
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Пример получения списка программ из реестра.
Может подойдет?

Код: AutoIt [Выделить]
$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


Русское сообщество AutoIt


Оффлайн Albarut [?]

  • Новичок
  • *
  • Сообщений: 4

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

Оффлайн Yuriy [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 737
  • Репутация: 281
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Albarut
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, UninstallString

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Albarut
Можно так попробовать:
Код: AutoIt [Выделить]
#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
Окно Установка и удаление программ можно так открыть:
Код: AutoIt [Выделить]
Run(@ComSpec & ' /C appwiz.cpl', '', @SW_HIDE)


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Albarut
Можно так попробовать...

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



Добавлено: Июль 22, 2010, 16:56:56
Для полного счачтья можно еще заменить RegRead() на _WinAPI_RegQueryValue().


Думай, прежде чем говорить.

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Yashied  [?]
Цитировать
полного счачтья
OffTopic1. :) Русский язык. :)
2. Вы не могли бы пример с _WinAPI_RegQueryValue() в цикле привести, а то у меня никак не получается в скрипт ее вставить.

Оффлайн Albarut [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
    • Награды
Низкий поклон madmasles! Всё замечательно работает!

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madmasles [?]
Цитировать
Русский язык
Это замечание тут неуместно, там просто опечатка, если присмотреться, буква «ч» расположена рядом с буквой «с» ;)

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

Код: AutoIt [Выделить]
#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)



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вы не могли бы пример с _WinAPI_RegQueryValue() в цикле привести, а то у меня никак не получается в скрипт ее вставить.

Код: AutoIt [Выделить]
#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)

« Последнее редактирование: Июль 22, 2010, 18:43:11 от Yashied »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
OffTopicCreatoR  [?]
Цитировать
Это замечание тут неуместно
Yashied,
Это была шутка, может быть, неуместная. Приношу Вам свои извинения. :-[
Функции из библиотеки WinAPIEx, при работе с реестром, дают увеличение скорости (у меня) ~ в 80 раз, по сравнению со штатными функциями. Обалдеть!

Оффлайн glax24 [?]

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

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2784
  • Репутация: 470
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
glax24
используй в примере ветку
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

нашел другой пример вывода списка
Код: AutoIt [Выделить]
#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

Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Получение названия установленной программы в окне
« Ответ #14 Отправлен: Октябрь 20, 2012, 02:09:18 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
4330 Просмотров
Последний ответ Август 01, 2010, 16:58:13
от assch
8 Ответов
6896 Просмотров
Последний ответ Октябрь 17, 2010, 14:49:36
от Garrett
4 Ответов
2599 Просмотров
Последний ответ Июль 21, 2011, 19:04:31
от yukuru
0 Ответов
1343 Просмотров
Последний ответ Август 16, 2013, 12:43:28
от Talany
1 Ответов
996 Просмотров
Последний ответ Апрель 29, 2015, 17:54:19
от InnI
11 Ответов
2674 Просмотров
Последний ответ Июнь 03, 2015, 13:01:53
от Yashied
5 Ответов
2308 Просмотров
Последний ответ Июнь 03, 2015, 22:35:20
от Yashied
15 Ответов
4959 Просмотров
Последний ответ Февраль 29, 2016, 00:33:53
от CreatoR
2 Ответов
395 Просмотров
Последний ответ Октябрь 16, 2017, 20:37:32
от OlegSmirnov
2 Ответов
65 Просмотров
Последний ответ Октябрь 11, 2018, 14:44:41
от Werwolfik