Показать полную графическую версию : Зацикливание появление разных окон в скрипте с выполнением команды
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
Неужели никто помочь не может ?
Попробовал запустить скрипт (только чуток переделал) - у меня срабатывает нормально. При запуске, если окна не открыты - не срабатывают горячие клавиши.
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
В этом варианте функция WinList возвращает список всех открытых окон и потом в цикле их перебирает, ждёт активации окна и дальше нажимает ваши горячие клавиши и пиликает что-то, затем скрипт зацикливается до тех пор, пока окно не закроется, дальше опять горячие клавиши и пиликание и так по кругу.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.