Что нового

[Автоматизация] Управление авто нажатием на кнопки в дос-программах

forbrock

Новичок
Сообщения
43
Репутация
0
Всем доброго времени суток.

Имеется программа, кот. запускается в дос режиме, в ходе ее работы с определенными файлами иногда происходят ошибки с окошком уведомления, в кот. есть варианты "да" и "нет".

Теперь вопрос - возможно ли управление этими окошками методом авто ответа на один из вариантов окна уведомления. Окно с ошибкой появляется непредсказуемо, так что простой последовательностью нажатий не обойтись.
Есть ли вариант WinActive для DOS, или как мне поступить в этом случае?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
можно посмотреть на эти окошки?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Запусти поиск по форуму на слово stdout и читай. :smile:
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
Вот собственно окошки с ошибками, которыми нужно управлять (скрины во вложении).
По поводу <b>stdout</b> ничего полезного не нашел, возможно в силу того, что еще очень плохо разбираюсь в AutoIt.

Код запускает программу на скринах и эмулирует последовательность нажатий кнопок, но когда появляются эти ошибки идет сбой, соответственно программа не выполняется...

Пока что работаю вот так вот:
(окно с ошибкой закрывается при нажатии Enter или Enter на кнопку "Нет", т.к. она активна по умолчанию, но в некоторых случаях ошибка появляется в местах, где нарушается последовательность нажатий. Часть кода с последовательностью нажатий представлена ниже)
Код:
FOR $v IN $a
Sleep (1500)
run ("g:\run.bat " & $v)
Sleep (2500)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{F11}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{down 4}")
Sleep (300)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{right}")
Sleep (100)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (2500)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (500)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (500)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{altdown}x{altup}")
Next
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сори, протупил немного - stdout это для случая полностью текстового режима.
По поводу вот этих окошек и кнопок. А Au3Info что пишет при наведении на них ?
 

madmasles

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


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

forbrock

Новичок
Сообщения
43
Репутация
0
Предупреждение
Как то упустил нужный тег... :smile:

По теме:
C2H5OH, Au3Info говорит, что
<b>title</b> это <b>C:\WINDOWS\system32\cmd.exe</b>, а
<b>class</b> это <b>ConsoleWindowClass</b> на все, что находится внутри консоли cmd.
И больше ничего.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Можешь прикрутить сюда PixelGetColor или PixelSearch. Если ошибка всегда на желтом фоне, то вообще все просто. И тогда в своем скрипте перед началом нового шага, проверяй на ошибки (если ли желтый пиксель по определенной координате).
Это конечно изврат:smile: но autoit для win окон делался.
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
inververs [?]
Можешь прикрутить сюда PixelGetColor или PixelSearch.
Да, думаю так можно попробовать. Вот только относительно окна запущенной программы или всей области Рабочего стола координаты указывать?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, ставишь в начале скрипта
Код:
Opt("PixelCoordMode", 1)


А в цикле ставишь
Код:
run ("g:\run.bat " & $v)
Sleep (2500)
$hwnd = WinGetHandle("C:\WINDOWS\system32\cmd.exe")


и потом после каждой кнопки
Код:
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","...")
Sleep (200)
If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then    ; я так понимаю что именно этот цвет
	; ...
EndIf


Кстати, а почему ты в конце не берёшь просто "!x"
Код:
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","!x")

?
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
Да, что то похожее у меня получилось сегодня на работе :smile: Только до ума еще не довел.
Код:
Opt ("PixelCoordMode", 0)

С параметром "0" в моем случае будет практичнее, т.к. окно в цикле - запускается, делает, что нужно и выходит. И так 23 раза. (а запускается не на одном месте).
Во Вторник доделаю и выложу что получилось. Дома нет возможности протестировать.

P.S. <b>!x</b> - Забыл за альт)
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
Как правильно сделать проверку ошибки, чтобы получилось как на блок-схеме?

Код:
$hwnd = WinGetHandle("C:\WINDOWS\system32\cmd.exe")

While
 If PixelGetColor(160,85,$hwnd) = 0xFFFF00 Then
	controlsend("C:\WINDOWS\system32\cmd.exe","","","{enter}")
   Else
	ExitLoop
 EndIf
WEnd

controlsend("C:\WINDOWS\system32\cmd.exe","","","{f11}")

; Снова запуск проверки


Пояснение к прикрепленной блок-схеме:
<b>Yes</b> - говорит, что на экране ошибка
<b>No</b> - что ошибки нет и выполняется след. оператор.

Кстати, что значит единица, <b>While 1</b> в коде, метку цикла?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
while 1 значит, что цикл будет выполнятся бесконечно. Вместо 1 может быть любое целое число.
Код:
$hwnd = WinGetHandle("C:\WINDOWS\system32\cmd.exe")
While 1
 If PixelGetColor(160,85,$hwnd) = 0xFFFF00 Then
    controlsend("C:\WINDOWS\system32\cmd.exe","","","{enter}")
   Else
    controlsend("C:\WINDOWS\system32\cmd.exe","","","{f11}")
 EndIf
sleep(5000)
WEnd

В этом коде цвет по указанным координатам будет проверяться раз в 5 сек, если цвет другой посылается f11.
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
sngr [?]
В этом коде цвет по указанным координатам будет проверяться раз в 5 сек, если цвет другой посылается f11.
Дело в том, что после нажатия F11 может тоже возникнуть ошибка, поэтому я вынес нажатие из цикла. А далее нужно подставить проверку снова. Если конечно я правильно сделал...
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Ты нажал ф11 - прошло 5 сек - проверка на цвет. И так бесконечно. Или после ф11 ошибка будет с другим цветом?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Мне представлялся вот такой скрипт
Код:
Opt("PixelCoordMode", 1)

FOR $v IN $a
	Sleep (1500)
	run ("g:\run.bat " & $v)
	Sleep (2500)
	$hwnd = WinGetHandle("C:\WINDOWS\system32\cmd.exe")
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{F11}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{down 4}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{right}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
	Sleep (200)
	If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
		; что-то нажать если ошибка
	EndIf
	ControlSend ("C:\WINDOWS\system32\cmd.exe","","","!x")
Next

Просто не знаю что нажимать нужно в каждом конкретном случае при возникновении ошибки.
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
Виноват... Немного не до пояснил.

F11 нужно нажимать всего один раз, в проверку ошибки заносить не нужно.
Вообще суть такая:

Запуск программы;
Возможное появление ошибки (нужно проверять);
Если есть - нажать {ENTER}
Если ошибки нет - нажать F11;
Возможное появление ошибки (нужно проверять);
Если ошибки нет - нажать {DOWN 4}{ENTER}{RIGHT}{ENTER}
Возможное появление ошибки (нужно проверять);
Тут ошибка может появиться неизвестное количество раз подряд;
Если есть - нажать {ENTER}
Если ошибки нет, несколько раз Enter для небольшой задержки и перестраховки:
Код:
for i=1 to 5
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
Sleep (200)
Next
; Далее Выход
ControlSend ("C:\WINDOWS\system32\cmd.exe","","","!x")


Но благодаря Вам я вроде разобрался как это сделать. Теперь нужно дождаться Вторника, когда буду на работе, чтобы протестировать.
 

Asshaker

Знающий
Сообщения
150
Репутация
17
2 Спирт, а если так?
Код:
...
Sleep (200)
If PixelGetColor(320,100,$hwnd) = 0xFFFF00 Then
    ; Кликаем мышкой да или нет
Else
    ControlSend ("C:\WINDOWS\system32\cmd.exe","","","{enter}")
EndIf
Sleep (200)
...

Если нет ошибки жмем кнопку.
 
Верх