Что нового

Запуск программы с неактивной кнопкой.

Fergus

Новичок
Сообщения
11
Репутация
0
Очень понравился Autoit. Решил начать помаленьку его изучать. Начал с создания скрипта для запуска CCleaner и столкнулся с проблемой, дело в том что после запуска CCleaner? кнопка "Анализ" неактивна в течении некоторого времени и только после этого становится активной. Как эмулировать нажатие на эту кнопку?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Fergus,
Подождите, пока она не станет активной.
Код:
$iCheck = 0

Run(@ProgramFilesDir & '\CCleaner\CCleaner.exe')
$hWin = WinWait('[Title:Piriform CCleaner; Class:PiriformCCleaner]', '', 5)
If Not $hWin Then Exit -33
$iStart = TimerInit()
While Not $iCheck
	$iCheck = ControlCommand($hWin, '', '[CLASS:Button; INSTANCE:1]', 'IsEnabled', '')
	Sleep(500)
	If TimerDiff($iStart) > 5000 Then ExitLoop
WEnd
If $iCheck Then
	MsgBox(64, 'Info', 'OK')
Else
	MsgBox(16, 'Error', 'Bad')
	Exit -55
EndIf
MsgBox(64, 'Info', 'Work')
 
Автор
F

Fergus

Новичок
Сообщения
11
Репутация
0
Тоже не срабатывает почему-то.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А так ?:
Код:
Run(@ProgramFilesDir & '\CCleaner\CCleaner.exe')
$hWin = WinWait('[Title:Piriform CCleaner; Class:PiriformCCleaner]')
ControlEnable($hWin, '', '[CLASS:Button; INSTANCE:1]')
 
Автор
F

Fergus

Новичок
Сообщения
11
Репутация
0
Все также,что интересно, скрипт запускает саму программу без проблем, но дальше не производится никаких действий(нажатие на кнопку "Анализ") и не выводится сообщений об ошибках. У меня вопрос, а как вы получили класс "Class:blum:iriformCCleaner"? Дело в том что Autoit Window Info отображает класс "#32770".
 

StarEdik

Новичок
Сообщения
365
Репутация
4
CCleaner v2.24.1010. У меня этот способ работает.
Заменил в скрипте madmasles
Код:
;$hWin = WinWait('[Title:Piriform CCleaner; Class:PiriformCCleaner]', '', 5)
На 
$hWin = WinWait('[Title:Piriform CCleaner; Class:#32770]', '', 5)
и
;MsgBox(64, 'Info', 'Work')
на
ControlClick('[Title:Piriform CCleaner;Class:#32770]','Анализ','[CLASS:Button; INSTANCE:1]','left',1)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
F

Fergus

Новичок
Сообщения
11
Репутация
0
Вот так все получилось, вот весь код:
Код:
Run(@ProgramFilesDir & '\CCleaner\CCleaner.exe')
$hWin = WinWait('[Title:Piriform CCleaner; Class:#32770]', '', 20)
ControlEnable($hWin, '', '[CLASS:Button; INSTANCE:1]')
ControlClick('[Title:Piriform CCleaner;Class:#32770]','Анализ','[CLASS:Button; INSTANCE:1]','left',1)
Sleep(100)
ControlClick('[Title:Piriform CCleaner;Class:#32770]','Очистка','[CLASS:Button; INSTANCE:2]','left',1)
Sleep(100)
Send("{ENTER}")
Sleep(20000)
WinClose('[Title:Piriform CCleaner;Class:#32770]')
Буду признателен, если можно что-то оптимизировать или подправить.
Спасибо также Zaramot за помощь. Только вот здесь, непонятно, если нетрудно объясните, что значат эти выражения:
Код:
$iCheck = 0
If Not $hWin Then Exit -33
$iStart = TimerInit()
While Not $iCheck
If TimerDiff($iStart) > 20000 Then ExitLoop
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Fergus,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Fergus [?]
Только вот здесь, непонятно, если нетрудно объясните
Код:
#include <ProgressConstants.au3>
#include <SendMessage.au3>
#include <GuiEdit.au3>

;проверял на CCleaner v3.17.1689

$iCheck = 0
$sMessage = ''

$iPid = Run(@ProgramFilesDir & '\CCleaner\CCleaner.exe');запускаем CCleaner
$hWin = WinWait('[Title:Piriform CCleaner; Class:PiriformCCleaner]', '', 5) ;ждем 5 сек его окно
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет окна :(')
	If ProcessExists($iPid) Then ProcessClose($iPid) ;закрываем процесс, если он есть
	Exit -33 ;если не дождались, то выход
EndIf
$iStart = TimerInit() ;фиксируем время начала отсчета
While Not $iCheck ;цикл пока кнопка не станет активной
	$iCheck = ControlCommand($hWin, '', '[CLASS:Button; INSTANCE:1]', 'IsEnabled', '')
	Sleep(500)
	If TimerDiff($iStart) > 10000 Then ExitLoop ;если прошло больше 10 сек принудительно завершаем цикл
WEnd
If Not $iCheck Then
	MsgBox(16, 'Error', 'Кнопка Анализ не стала активной :(')
	WinClose($hWin) ;закрываем окно
	Exit -55
EndIf
ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]') ;кликаем по кнопке Анализ
$hProgress = ControlGetHandle($hWin, '', '[CLASS:msctls_progress32; INSTANCE:1]') ;получаем Handle Progress bar`a
$iStart = TimerInit() ;фиксируем время начала отсчета
While $iCheck < 100 ;цикл
	$iCheck = _SendMessage($hProgress, $PBM_GETPOS) ;получаем данные из Progress bar`a
	ConsoleWrite(StringFormat('%d%', $iCheck) & @LF)
	Sleep(200)
	If TimerDiff($iStart) > 20000 Then ExitLoop ;если прошло больше 20 сек принудительно завершаем цикл
WEnd
If $iCheck < 100 Then
	MsgBox(16, 'Error', 'Не дождались окончания анализа :(')
	WinClose($hWin) ;закрываем окно
	Exit -77
EndIf
$hEdit = ControlGetHandle($hWin, '', '[CLASS:Edit; INSTANCE:2]') ;получаем Handle Edit
$iCheck = _GUICtrlEdit_GetLineCount($hEdit) ;получаем кол-во строк в Edit
For $i = 0 To $iCheck - 1
	$iStart = _GUICtrlEdit_GetLine($hEdit, $i) ;получаем текст построчно
	If StringRegExp($iStart, '[ЁёА-Яа-я]') Then ;если есть русские буквы
		$sMessage &= $iStart & @LF ;присоединяем к сообщению
	EndIf
Next
MsgBox(64, 'Info', StringTrimRight($sMessage, 1))
MsgBox(64, 'Info', 'Здесь делаем все, что нам нужно дальше')
 
Автор
F

Fergus

Новичок
Сообщения
11
Репутация
0
Здорово нет слов еще учиться и учится.
 
Верх