Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Зацикливание появление разных окон в скрипте с выполнением команды (http://forum.oszone.net/showthread.php?t=303584)

nibble74 07-08-2015 03:01 2538175

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

читать дальше »
Код:

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 2555740

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

Код:

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 2556749

Неужели никто помочь не может ?

ra4o 24-09-2015 22:10 2557336

Попробовал запустить скрипт (только чуток переделал) - у меня срабатывает нормально. При запуске, если окна не открыты - не срабатывают горячие клавиши.
Код:

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 2557384

Так я не силён в написании скриптов, поэтому и просил помощи.
К сожалению, при запуске скрипта повышается нагрузка на процессор, до 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 2557461

В этом варианте функция
Код:

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


Время: 14:30.

Время: 14:30.
© OSzone.net 2001-