Войти

Показать полную графическую версию : Зацикливание появление разных окон в скрипте с выполнением команды


nibble74
07-08-2015, 03:01
Помогите в написании скрипта такого типа :

Example()
Func Example()
WinWait("WinInfo")
Send("^!{h}")
SoundPlay(@WindowsDir & "\media\Windows Exclamation.wav")
WinWaitClose("WinInfo")
Send("^!{h}")
SoundPlay(@WindowsDir & "\media\Windows Notify.wav")
Return Example()

Вообщем суть такова, запустил одну игру, сработало Ctrl+Alt+h, закрыл игру и снова сработало Ctrl+Alt+h.
Запустил другую игру и снова сработали горячие клавиши, так по кругу. Не могу зациклить в скрипте проверку запущенного окна той или иной игры.

Не хотелось бы писать этот код для каждой конкретной игры, так как в автозагрузке придётся держать много запущенных процессов AutoIt-а.

Как уместить всё в одном файле, чтобы несколько 'отслеживаемых окон' (или 'процессов.ехе') были зациклены и скрипт всегда сидел в трее.

Вот тут у меня загвоздка, не знаю как написать такой скрипт в одном файле.

Пожалуйста, нужна помощь.

nibble74
21-09-2015, 08:53
Вот нашёл такой вариант, может поможет кто нибудь откорректировать или объяснить что там к чему.

Global $all_windows[4] = [3, 'title 1', 'title 2', 'title 3'] ; (3) -количество окон, title 1 - Названия окон
Global $close_windows[4] = ["", 0, 0, 0] ;массив на количество окон
Global $time = 5


While 1

For $i = 1 to $all_windows[0]
$Handle = WinGetHandle($all_windows[$i])
$Exist = WinExists($Handle)

If $Exist = 1 And $close_windows[$i] = 0 Then
$hWnd = WinWait($Handle, '', $time)
If Not $hWnd Then MsgBox(64, 'Ошибка', 'В указонный промежуток времени окно найдено небыло.')

Send('^!{h}')
$close_windows[$i] = 1
ElseIf $Exist = 0 And $close_windows[$i] = 1 Then
Send('^!{h}')
$close_windows[$i] = 0
EndIf
Next
WEnd

Здесь при запуске скрипта сразу же срабатывают горячие клавиши. Пробовал так же и без $time, удаляя переменную.
Где там ошибка ?

nibble74
23-09-2015, 16:42
Неужели никто помочь не может ?

ra4o
24-09-2015, 22:10
Попробовал запустить скрипт (только чуток переделал) - у меня срабатывает нормально. При запуске, если окна не открыты - не срабатывают горячие клавиши.
Global $all_windows[3] = [ 'title1', 'title 2', 'title 3'] ; title - Названия окон
Global $close_windows[3] = [ 0, 0, 0] ;массив на количество окон



While 1

For $i = 0 to UBound( $all_windows)-1
$Handle = WinGetHandle($all_windows[$i])
$Exist = WinExists($Handle)

If $Exist = 1 And $close_windows[$i] = 0 Then

Send('^!{h}')
$close_windows[$i] = 1
ElseIf $Exist = 0 And $close_windows[$i] = 1 Then

Send('^!{h}')
$close_windows[$i] = 0
EndIf
Next
WEnd
Не понятно - зачем Вы вставили в массив количество элементов, если всегда можно узнать функцией "Ubound"? Но массив у вас статический, даже и без этого кол-во элементов известно. Так-же не пойму, зачем ждать появления окна, если ранее получили его дескриптор и даже проверили, что оно уже существует ?

nibble74
25-09-2015, 00:11
Так я не силён в написании скриптов, поэтому и просил помощи.
К сожалению, при запуске скрипта повышается нагрузка на процессор, до 50% грузится, что не есть гуд.
Как так, что может так нагружать ?

Подсказали ещё с одним вариантом, но не пойму как вписывать названия окон.

Global $all_windows

While 1
$all_windows = WinList()

For $i = 1 to $all_windows[0][0]

If WinActive($all_windows[$i][1]) Then
$iState = WinGetState("[ACTIVE]", "")

If BitAND($iState, 32) Then
Send("^!{h}")
SoundPlay(@WindowsDir & "\media\Windows Exclamation.wav")

Do
Sleep(100)
Until WinWaitClose($all_windows[$i][1])
Send("^!{h}")
SoundPlay(@WindowsDir & "\media\Windows Notify.wav")
EndIf
EndIf
Next
WEnd

ra4o
25-09-2015, 10:32
В этом варианте функция WinList возвращает список всех открытых окон и потом в цикле их перебирает, ждёт активации окна и дальше нажимает ваши горячие клавиши и пиликает что-то, затем скрипт зацикливается до тех пор, пока окно не закроется, дальше опять горячие клавиши и пиликание и так по кругу.




© OSzone.net 2001-2012