Что нового

Запуск программы. Ожидание запуска. Закрытие по нажатию на крестик. Перезапуск

druid

Новичок
Сообщения
5
Репутация
0
Версия AutoIt: 3.3.14.5

Описание:
После перезагрузки компьютера, запускается программа zennoposter, но ввиду того что в ней есть глюк, программу zennoposter надо закрыть по нажатию на крестик, и когда она закроется, снова запустить её, и тогда она будет работать нормально.

Алгоритм я вижу следующий:
1. Скрипт висит в автозагрузке и срабатывает когда пользователь вошёл в систему (залогинился).
2. Через 20 секунд, после того как пользователь залогинился, скрипт запускает программу zennoposter (путь к программе я укажу в скрипте)
3. После того, как программа zennoposter загрузится (это примерно секунд 30). Скрипт должен закрыть программу zennoposter, по нажатию на крестик (как стандартно закрываются программы в windows'е, справа вверху на крестик). (вариант завершать процесс программы не подходит, т.к. при таком завершении программы она не стартует корректно, нужно именно нажимать на крестик).
4. После того как программа zennoposter закроется (это примерно 5-10 секунд). Нужно снова запустить zennoposter.
5. На этом скрипт завершается до следующей перезагрузки компьютера.


Примечания:
windows 2008 eng, без монитора. При перезагрузке компьютера происходит автоматический autologin. Т.к. компьютер без монитора, разрешение при перезагрузке неизвестно. Предположительно может быть 1024*768. При подключении rdp 1900*980.

При успешной работе скрипта, с меня на пиво, гарантирую)
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Опишите поподробнее какие процессы появляются при запуски данной программы и окна (имена/названия).
Так как я сейчас установил данную программу и у меня появилось три процесса и окно имеет заголовок
"ZennoPoster Demo v5.30.0.0 by ZennoLab.com (Demo версия перестанет работать через 14 дней)"
 
Автор
druid

druid

Новичок
Сообщения
5
Репутация
0
Появляется окно с наванием
"ZennoPoster 7.0.1.0 (201907080533) by ZennoLab.com"
И процесс с таким-же именем.
Я думал найти окно программы с таким именем и нажать мышкой на кнопку закрытия окна программы.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Пробуй по названию окна
Код:
$sPatch = 'C:\Program Files\ZennoLab\RU\ZennoPoster Demo\5.30.0.0\Progs\ZennoPoster.exe'
$sTitle = 'ZennoPoster Demo v5.30.0.0 by ZennoLab.com (Demo версия перестанет работать через 14 дней)';'ZennoPoster 7.0.1.0 (201907080533) by ZennoLab.com'
Start_($sPatch)
Exit

Func Start_($_sPatch)
	Local $_sWorkingDir = StringRegExpReplace($_sPatch, '(.:)\\(.*)\\(.*)\.(.*)', '$1\\$2')
	Local $_iProcess = Run($_sPatch, $_sWorkingDir)
	WinWait($sTitle, '', 60)
	Sleep(2000)
	WinClose($sTitle)
	While Sleep(1000)
		If Not ProcessExists($_iProcess) Then
			ExitLoop
		EndIf
	WEnd
	Run($_sPatch, $_sWorkingDir)
EndFunc
А версия программы случайно не портабельная?
А то имя процесса не соответствует.


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

Вот еще пример, посложнее. Скрипт запускает программу, ждет появления окна содержащего в имени слова "ZennoPoster"
проверяет принадлежит ли окно нашему процессу, так же видимо ли окно, если все критерии совпадают, то посылаем этому окну команду закрытся.
Ждем завершения процесса нашей программы и перезапускаем ее, скрипт завершает работу.
Код:
#include <WinAPI.au3>

$sPatch = 'C:\Program Files\ZennoLab\RU\ZennoPoster Demo\5.30.0.0\Progs\ZennoPoster.exe'

Start_($sPatch)
Exit


Func Start_($_sPatch)
	Local $_aWList, $_iA, $_iPID, $_iState
	Local $_sWorkingDir = StringRegExpReplace($_sPatch, '(.:)\\(.*)\\(.*)\.(.*)', '$1\\$2')
	Local $_iProcess = Run($_sPatch, $_sWorkingDir)
	While Sleep(1000)
		If Not ProcessExists($_iProcess) Then
			ExitLoop
		EndIf
		$_aWList = WinList()
		For $_iA = 1 To $_aWList[0][0]
			StringReplace($_aWList[$_iA][0], 'ZennoPoster', '')
			If @extended Then
				_WinAPI_GetWindowThreadProcessId($_aWList[$_iA][1], $_iPID)
				If $_iPID = $_iProcess Then
					$_iState = WinGetState($_aWList[$_iA][1])
					If BitAND($_iState, 2) Then
						Sleep(2000)
						ConsoleWrite($_aWList[$_iA][1]&' - Closed'&@CRLF)
						WinClose($_aWList[$_iA][1])
						ProcessWaitClose($_iProcess)
						ExitLoop
					EndIf
				EndIf
			EndIf
		Next
	WEnd
	Run($_sPatch, $_sWorkingDir)
EndFunc
 
Автор
druid

druid

Новичок
Сообщения
5
Репутация
0
IMStrelcov сказал(а):
Вот еще пример, посложнее...
Отличная работа! В яблочко! :IL_AutoIt_1: Скинь в личку реквизиты для выражения благодарности)) :beer:
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
druid сказал(а):
Скинь в личку реквизиты для выражения благодарности)) :beer:
Спасибо, но не стоит, я не ради корысти помог, сам с этого начинал и знаю как трудно найти помощь.
 
Автор
druid

druid

Новичок
Сообщения
5
Репутация
0
IMStrelcov сказал(а):
Спасибо, но не стоит, я не ради корысти помог, сам с этого начинал и знаю как трудно найти помощь.
Благодарю тебя мил человек, от души :beer: если всё ж надумаешь, пиши не стесняйся :smile:
 
Верх