Что нового

[Автоматизация] Помогите сформулировать/дописать условие.

lzw

Новичок
Сообщения
4
Репутация
0
Доброго времени суток!
Написал вот такой код (с комментариями):
Вообщем скрипт выделяет слово (слова идут столбцом, к примеру так:
Молоко
Реклама
шрифт
Иконка
) потом копирует выделенное слово в буфер обмена, переходит в другое окно, нажимает Поиск, вставляет слово, ищет, если нашлось (это если никаких ошибок не вылезло) переключается обратно на предыдущее окно, выделяет следующее слово.
Код:
While 1
ProcessWait ("notepad++.exe")
Send("{CTRLDOWN}{TAB}{CTRLUP}")        ; ---- переключение между окнами
Send("{DOWN}{HOME}{SHIFTDOWN}{END}{SHIFTUP}{CTRLDOWN}c{CTRLUP}")   ; ---- перемещение на начало строки, выделение, копирование в буфер обмена
Send("{CTRLDOWN}{TAB}{CTRLUP}")         ; ---- переключение между окнами
Send("{CTRLDOWN}f{CTRLUP}")                  ; ---- CTRL+F, горячая клавиша поиска
Send("{CTRLDOWN}v{CTRLUP}")                  ; ---- вставляем из буфера обмена
Send("{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{ENTER}")    ; ---- идём до кнопочки искать далее
Send("{TAB}{TAB}{TAB}{TAB}{ENTER}")                       ; ---- идём до кнопочки закрыть - закрываем
WEnd

И цикл повторяется, но мне нужно добавить одно условие: если слова нет то выходит ошибка -

Суть условия такая: если не выходит этой ошибки то первый цикл повторять постоянно, а если вылезла эта ошибка то выполнить этот код:
Код:
winwaitactive("Find","")
Send("{ENTER}")
Send("{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{ENTER}")
Send("{CTRLDOWN}{TAB}{CTRLUP}")
Send("{DEL}{DEL}")
Send("{CTRLDOWN}{TAB}{CTRLUP}")


И опять выолнить первый цикл
Всем спасибо, если нужно что то уточнить, просите - допишу.
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Так?
Код:
While 1
	ProcessWait("notepad++.exe")
	Send("^{TAB}") ; ---- переключение между окнами
	Send("{DOWN}{HOME}+{END}^c") ; ---- перемещение на начало строки, выделение, копирование в буфер обмена
	Send("^{TAB}") ; ---- переключение между окнами
	Send("^f") ; ---- CTRL+F, горячая клавиша поиска
	Send("^v") ; ---- вставляем из буфера обмена
	Send("{TAB 6}{ENTER}") ; ---- идём до кнопочки искать далее
	Sleep(500) ; ждем полсекунды пока идет поиск, или сколько он там ищет
	If WinExists("Find", "Can't find the text") Then 
		_Window()
		ContinueLoop
	EndIf
	Send("{TAB 4}{ENTER}") ; ---- идём до кнопочки закрыть - закрываем
WEnd

Func _Window()
	WinActivate("Find", "")
	WinWaitActive("Find", "")
	Send("{ENTER}")
	Send("{TAB 10}{ENTER}")
	Send("^{TAB}")
	Send("{DEL 2}")
	Send("^{TAB}")
EndFunc


А вообще Notepad++ должен нормально работать с CtrlClick и CtrlSend. Намного надежнее, посмотрите про них в справке.
 
Автор
L

lzw

Новичок
Сообщения
4
Репутация
0
Dm666 :laugh:
Афигенно!
Спасибо - идеально работает!
Во время тестирования обнаружилась не очень приятная ситуация(
Допустим текст большого размера 50мб , слово гдето в конце, или вообще нет, а поиск пробегается по всему док-ту, В этом момент notepad++ разумеется подвисает, а скрипт кликает без разбору, а когда нотпад++ просканил и слова не нашлось то из-за кликания скрипта окно оказывается на заднем млане, скрипт уже правильно по нему не кликнет, и работа стопорится из-за висяка и кликов....
Я подумал в скрипте натыкать sleep-ов....
Но это будет тормозить общую работу....
Не подскажите как лучше сделать?
Еще раз спасибо огромное! :IL_AutoIt_1:
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Ну тогда что-то типа такого.
Код:
Opt("WinTitleMatchMode", 2)
Opt("SendKeyDelay", 10) ; а лучше вообще 50 поставить, надежней будет
HotKeySet("{Esc}", "_Exit") ; выход из скрипта по Esc 

WinWaitActive("Notepad++") ; ждем пока окно Notepad не будет активно

While 1
	Send("^{TAB}") ; ---- переключение между окнами
	Send("{DOWN}{HOME}+{END}^c") ; ---- перемещение на начало строки, выделение, копирование в буфер обмена
	Send("^{TAB}") ; ---- переключение между окнами
	Send("^f") ; ---- CTRL+F, горячая клавиша поиска
	Send("^v") ; ---- вставляем из буфера обмена
	ControlClick("Find","","[CLASS:Button; INSTANCE:21]") ; тыкаем "Find Next" 
    
	While 1
		Sleep(50) ; разгружаем проц
		WinActivate("Notepad++") ; пытаемся активировать окно NP++. Если он занят поиском, ничего у нас не выйдет
		If WinActive("Notepad++") Then ExitLoop ; окно активировалось, значит поиск окончен, выходим из цикла
	WEnd
    Sleep(50) ; хуже не будет
	
    If WinExists("Find", "Can't find the text") Then ; проверяем наличие окна
;~         Beep (1000,100)
		_NotFound()
	Else
        ControlClick("Find","Match &whole word only","[CLASS:Button; INSTANCE:30]") ; Закрыть форму поиска
    EndIf

WEnd

Func _NotFound()
    WinActivate("Find", "Can't find the text")
    WinWaitActive("Find", "Can't find the text")
	Send("{ENTER}")
	ControlClick("Find","Match &whole word only","[CLASS:Button; INSTANCE:30]") ; Закрыть форму поиска
	Send("^{TAB}")
	Send("{DEL 2}") ; а вот тут может одного Del-a достаточно? иначе через строчку прыгает.
	Send("^{TAB}")
EndFunc

Func _Exit()
	Exit
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Не очень понял что вам нужно, если просто найти слово, фразу или предложение в текстовом документе, то вот:

Код:
Func SearchString($File,$String)
	
	Local $sResult
	
	$sFile = FileOpen($File)
	$sRead = FileRead($sFile)
	FileClose($sFile)

	If StringRegExp($sRead, $String) = 1 Then
		$sResult = 1
	Else
        $sResult = 0		
	EndIf

    Return $sResult
   
EndFunc


Если нашёл возвращает 1, если нет 0
 
Автор
L

lzw

Новичок
Сообщения
4
Репутация
0
Dm666
Спасибо огромное!
Но кажется скрипт не тыкает по кнопке Искать далее :D, наверное потому что нотпад у меня русский
Щас сижу смотрю код.
П.С как мне Вас отблагодарить?
Send("{DEL 2}") ; а вот тут может одного Del-a достаточно? иначе через строчку прыгает.
М... должно так работать
Было:
Молоко
Реклама
шрифт
Иконка


Стало:
Del+Del
Молоко
шрифт
Иконка

И как Вы отловили CLASS:Button; INSTANCE... кнопки искать далее, я с AutoIt Window Info и так и так мучался... выделяет только всё окно...
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
lzw [?]
Но кажется скрипт не тыкает по кнопке Искать далее , наверное потому что нотпад у меня русский
О как. По скринам я похоже было что английский. ;) Значит текст надо заменить...
А вообще, вариант считать файл в память, вроде того что предложил Viktor1703 намного лучше.

И как Вы отловили CLASS:Button; INSTANCE... кнопки искать далее, я с AutoIt Window Info и так и так мучался... выделяет только всё окно...
Есть вот такая штука за авторством Yashied. Рекомендую, в 9 случаях из 10 она информативнее чем Au3WInfo
 
Автор
L

lzw

Новичок
Сообщения
4
Репутация
0
Dm666
Я серьёзно! он русский - только это окошечко похоже забыли перевести ;D
Вроде с оф сайта качал, давно это было... мб и в правду не до перевели... :scratch:
Значит текст надо заменить...
Или нотпад на инглиш переключить.
Есть вот такая штука за авторством Yashied. Рекомендую, в 9 случаях из 10 она информативнее чем Au3WInfo
Спасибо за ссылку на Control Viewer, мощьная штука!
А вообще, вариант считать файл в память, вроде того что предложил Viktor1703 намного лучше.
Спасибо, его то же изучу.
Dm666 спасибо!
Viktor1703 спасибо!
 

antonelsky

Новичок
Сообщения
1
Репутация
0
Помогите плиз написать условие к скрипту!!!!! Я запускаю игрушку(напиример Couter Strike), мне нужно полазать по менюшке, запустить игру и выйти из неё. Я для этого код вроде написал. Но как условие написать, что если на каком-то этапе возникнет ошибка, как об этом узнать?????Помошите пожалуйста.

Run('D:\Program Files\Counter-Stirike 1.6\hl.exe -nomaster -game cstrike'); вход в игру cs
Sleep(7000); ждём запуск игры
Send("{DOWN 3}")
Send("{ENTER}"); переходим во вкладку Options
Sleep(3000)
Send("{TAB 11}")
Sleep(2000)
Send("{ENTER}"); закрываем вкладку Options
Sleep(1000)
Send("{UP 2}")
Sleep(1000)
Send("{ENTER}"); нажимаем на New Game
Sleep(2000)
Send("{DOWN 10}"); выбор карты
Sleep(2000)
Send("{ENTER}")
Sleep(8000); ждём загрузку карты
Send("{ENTER}")
Sleep(3000)
Send("{NUMPAD1}"); выбор за ботов
Sleep(3000)
Send("{NUMPAD1}"); выбор экипировки
Sleep(4000); длительность процесса игры
Send("{ESC}"); вход в меню
Sleep(2000)
Send("{DOWN 3}")
Send("{ENTER}"); выход из игры
Sleep(2000)
Send("{ENTER}"); подтверждение выхода из игры

Здесь используется симуляция нажатия клавиш. И как написать условие, что если прога не туда в игре зайдёт или что-то не загрузится или ошибка произойдёт, или код не сработает в каком-то месте????????Мне на ум приходит вот это, но я в нём сильно сомневаюсь:

If @error Then
Send("Quit:{ENTER}"); и это команда неправильная, я не знаю, как ссылаться на кнопки в игре, только с помощью симуляции клавиш Send("{DOWN 3}") Send("{ENTER}")
ContinueLoop
Elseif
Next

Помогите, плиззззззз!




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

Помогите плиз написать условие к скрипту!!!!! Я запускаю игрушку(напиример Couter Strike), мне нужно полазать по менюшке, запустить игру и выйти из неё. Я для этого код вроде написал. Но как условие написать, что если на каком-то этапе возникнет ошибка, как об этом узнать?????Помошите пожалуйста.

Run('D:\Program Files\Counter-Stirike 1.6\hl.exe -nomaster -game cstrike'); вход в игру cs
Sleep(7000); ждём запуск игры
Send("{DOWN 3}")
Send("{ENTER}"); переходим во вкладку Options
Sleep(3000)
Send("{TAB 11}")
Sleep(2000)
Send("{ENTER}"); закрываем вкладку Options
Sleep(1000)
Send("{UP 2}")
Sleep(1000)
Send("{ENTER}"); нажимаем на New Game
Sleep(2000)
Send("{DOWN 10}"); выбор карты
Sleep(2000)
Send("{ENTER}")
Sleep(8000); ждём загрузку карты
Send("{ENTER}")
Sleep(3000)
Send("{NUMPAD1}"); выбор за ботов
Sleep(3000)
Send("{NUMPAD1}"); выбор экипировки
Sleep(4000); длительность процесса игры
Send("{ESC}"); вход в меню
Sleep(2000)
Send("{DOWN 3}")
Send("{ENTER}"); выход из игры
Sleep(2000)
Send("{ENTER}"); подтверждение выхода из игры

Здесь используется симуляция нажатия клавиш. И как написать условие, что если прога не туда в игре зайдёт или что-то не загрузится или ошибка произойдёт, или код не сработает в каком-то месте????????Мне на ум приходит вот это, но я в нём сильно сомневаюсь:

If @error Then
Send("Quit:{ENTER}"); и это команда неправильная, я не знаю, как ссылаться на кнопки в игре, только с помощью симуляции клавиш Send("{DOWN 3}") Send("{ENTER}")
ContinueLoop
Elseif
Next

Помогите, плиззззззз!
 

madmasles

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

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


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