<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; Определение запущенных окон (League of Legends)]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10818&amp;type=atom" />
	<updated>2015-07-25T00:47:57Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=10818</id>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96010#p96010" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Remelibo пишет:</cite><blockquote><p>&quot;Таймер&quot; надо зациклить через loop или ещё что-то сделать? И как &quot;таймер&quot; добавить в код, т.е. что бы он работал как надо. Через Gosub или ещё как реализовать запуск таймера, этой проверки есть/нет окон?</p></blockquote></div><p>1. Таймер не нужно зацикливать и делать прочие пакости, таймер отдельный поток он работает сам по себе.<br />2. Использование Gosub на подпрограмму таймера не нужно, если только ты не вырубил таймеры и надо окна отдельно проверять.<br />3. Про добавить в код... сейчас напишу это просто.<br /></p><div class="codebox"><pre><code>;-----Инициализация
;Скрипт не выгружается до явного определения
#Persistent
;Запрет повторного запуска
#SingleInstance  Ignore

; принудительная проверка или же...
Gosub lWinExistApp

;Написать код ожидания одного из окон и вкл. таймер.

;1 - Ждём окно одно из трёх, как в таймере просто от туда взять кусок ожидания, можно бесконечный или с ограничением по времени

;2- Вкл таймер и выходим.
; Его желательно не выключать без нужды, хотя и можно использовать Thread, NoTimers, но включать не забывать обратно
; То есть соблюдать парность Thread, NoTimers и Thread, NoTimers, False
SetTimer, lWinExistApp, 2000 
Return</code></pre></div><p> Это должно быть в самом начале скрипта и более таймер <strong>lWinExistApp</strong> не трогать.</p><p>Всё ясно?</p><p><strong>UPD</strong> </p><div class="quotebox"><blockquote><p>и сделать, что бы он запускался в самом начале исполнения основного скрипта, дописав в условие &quot;если окон не найдено&quot; что-то вроде Process,Close, и название основного скрипта. Думаю, должно работать, хотя такое решение, наверное, корявенькое...</p></blockquote></div><p> так наиболее верно, но проще из скрипта запускать программу и ждать скажем 5-7 секунд.</p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-25T00:47:57Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96010#p96010</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96009#p96009" />
			<content type="html"><![CDATA[<p>-del</p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-25T00:24:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96009#p96009</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96008#p96008" />
			<content type="html"><![CDATA[<p>Спасибо, на следующей неделе проверю работоспособность (дача на выходных).</p><p>Насчёт &quot;что не работает&quot; - не очень разобрался с кодом &quot;таймера&quot;. Дописав в начале хоткей и закинув код в чистый файл - всё работает как надо, по нажатию на хоткей, проверяется есть/отсутствует нужное окно. Но как сделать эту проверку не разовой, не привязанной к хоткею? &quot;Таймер&quot; надо зациклить через loop или ещё что-то сделать? И как &quot;таймер&quot; добавить в код, т.е. что бы он работал как надо. Через Gosub или ещё как реализовать запуск таймера, этой проверки есть/нет окон? Эх, наверное слишком много прошу... <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p><strong>upd.</strong> Пока писал пост, ты уже выложил весь код с таймером, благодарю. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Буду разбираться, спасибо.</p><p>В общих чертах разобрал код, проверил. Проверка есть/нет окон, начинает работать по нажатию на F11, когда включен accepter. Впринципе, можно наверное в отдельный скрипт закинуть &quot;таймер&quot; и сделать, что бы он запускался в самом начале исполнения основного скрипта, дописав в условие &quot;если окон не найдено&quot; что-то вроде Process,Close, и название основного скрипта. Думаю, должно работать, хотя такое решение, наверное, корявенькое...</p>]]></content>
			<author>
				<name><![CDATA[Remelibo]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=32496</uri>
			</author>
			<updated>2015-07-25T00:22:47Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96008#p96008</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96007#p96007" />
			<content type="html"><![CDATA[<p><strong>Remelibo</strong> Решил дописать, то что спрашивал. Не очень идеально, так сказать, общий вариант.<br />И чего не сделаешь во благо рода человеческого. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /><br /></p><div class="codebox"><pre><code>; Всё отлажено и работает, обязательно читать комментарии!!!
; Точки отладки по поиску окон при необходимости раскомментировать, для проверки своих экспериментов.</code></pre></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Сам код ТУТ.</div><div class="fancy_spoiler"><div class="codebox"><pre><code>; Всё отлажено и работает, обязательно читать комментарии!!!
; Точки отладки по поиску окон при необходимости раскомментировать, для проверки своих экспериментов.
F11::
  gojoin:=!gojoin
  If (gojoin)
      {
        ;Частота таймера отладочная, можно поменять на свою
        SetTimer, Accepter, 200
        ;Активация таймера контроля окон, поставил здесь, т.к. не знал куда ещё.
        SetTimer, lWinExistApp, 2000  ; Частота проверка окон = 2 секунды
      }
    Else
      {
        SetTimer, Accepter, off
        SetTimer, lWinExistApp, Off
        sleep 100
        ;Убрать надпись последнего ToolTip сообщения с экрана, в играх может не сработать
        ToolTip 
      }
Return

Accepter:
    ;Очень часто, но что бы поправить нужны доп. условия
    ToolTip, Accepter is active`nPress F11 to deactivate
    ;Что то делаем, можно временно сделать Thread, NoTimers, но тогда проверка окон не будет работать!!!
    ;Если обработка по таймеру длительная.
Return

lWinExistApp:
  ; Пример на двух окнах виндовый NotePad(&quot;Блокнот&quot;) и Total Commander(&quot;Total Commander&quot;)
  ; Пример обобщённый - можно сделать всё проще
  Thread, NoTimers
  cWaitWin := 2000        ; сколько ждать окна в сумме всех шагов цикла
  j        := 10          ; число шагов с задержкой cSleep
  cSleep   := cWaitWin//j ; // - Целочисленное деление
  ;DetectHiddenWindows нужен только для работы со скрытими окнами. Max Min oкна находятся.
  ;WinExist возвращает HWID окна, два одинаковых приложения будут иметь разный HWID, при False(0) окно не найдено
  DetectHiddenWindows, on ; Обнаруживать скрытые окна, не путать с минимизацией!!!
  SetTitleMatchMode, 2    ; Имя окна должно содержать указанное слово
  Loop %j%
    {
      If (WinExist(&quot;Блокнот&quot;) || WinExist(&quot;Total Commander&quot;))
              {
                i := 0
                ;MsgBox True %A_Index% - для отладки
                Break ; Хотя бы из одних окон существует - завершаем цикл
              }  
            Else
            {
              Sleep %cSleep% ; Ждём сколько указали
              i := A_Index   ; Запомнили шаг итерации, при отсутствии окон J = I
              ;MsgBox False %A_Index% - для отладки
            }
    }        
  If (i = j) ; Окон так и не нашли
      {
         ;MsgBox Окна нет %i% и %j%   - для отладки
         ExitApp
      }     
   ;MsgBox Окна есть %i% и %j%    - для отладки
   Thread, NoTimers, False ; Вкл таймеры и продолжаем &quot;Танец с бубном&quot;
Return</code></pre></div></div></div>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-25T00:19:30Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96007#p96007</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96006#p96006" />
			<content type="html"><![CDATA[<p>Дальше, я запутался с твоим постом - что не работает, то?</p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-24T20:24:14Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96006#p96006</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96005#p96005" />
			<content type="html"><![CDATA[<p>Начнём с таймера.<br />Вот, на 100% работающий код, у меня точно на 100% работает. </p><div class="codebox"><pre><code>F11::
    gojoin:=!gojoin
    If (gojoin)
      {
        SetTimer, Accepter, 200 ; Частоту исправил, для тестирования
        gosub, Accepter ; На таймер для быстрой его активации - не обязательно       
      }
      Else
      {
        SetTimer, Accepter, off
        sleep 100
        ToolTip ;Отключение сообщения с экрана
        
      }
Return

Accepter:
    ToolTip, Accepter is active`nPress F11 to deactivate
    ;Что то делаем, можно временно сделать Thread, NoTimers
    ;Если обработка по таймеру длительная.
Return</code></pre></div><p>&nbsp; Просто кое где упустил: <br /> - скобки в <strong>IF ( условие&nbsp; должно быть в скобках)</strong>;<br /> - нет конечного&nbsp; <strong>Return</strong> в коде обработки. </p><div class="codebox"><pre><code>F11::
;код обработки
Return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-24T20:01:53Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96005#p96005</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95938#p95938" />
			<content type="html"><![CDATA[<p>Таймер вкл/выкл в этом участке кода:<br /></p><div class="codebox"><pre><code>F11::
    gojoin:=!gojoin

if gojoin

{

gosub, Accepter ;там уже поиск по изображению и &quot;ToolTip, Accepter is active`nPress F11 to deactivate&quot;

sleep 100

SetTimer, Accepter, 2012

}

else

{

ToolTip ;вроде должен был отключить надпись

SetTimer, Accepter, off

}</code></pre></div><p>С кодом таймера пока не совсем разобрался, как его в общий код корректно добавить или хотя бы как отдельно запустить данный код. Его следует зациклить? Что-то пытался через Loop зациклить - не вышло. Для проверки на Notepad проверял: <br /></p><div class="codebox"><pre><code>If (WinExist(&quot;ahk_class Notepad&quot;))</code></pre></div><p>и добавил 5 секундную паузу:<br /></p><div class="codebox"><pre><code>Thread, NoTimers, False
sleep, 5000
Return ; Одно из окон существует даже если оно скрыто</code></pre></div><p>Если не трудно, подскажи, с какой стороны к коду подобраться.</p>]]></content>
			<author>
				<name><![CDATA[Remelibo]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=32496</uri>
			</author>
			<updated>2015-07-23T16:58:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95938#p95938</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95925#p95925" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Ещё проблемка со строкой ToolTip, Accepter is active`nPress F11 to deactivate - по нажатию F11, подтверждалка работает, после повторного нажатия F11, подтверждалка выключается, но надпись Accepter is active остаётся висеть на экране.</p></blockquote></div><p> Что бы убрать последнюю надпись от <strong>ToolTip</strong>&nbsp; надо написать. <br /></p><div class="codebox"><pre><code>Sleep 100
ToolTip</code></pre></div><p> Скрипт твой не смотрел, т.е. смотрел, но не понял, как ты отключаешь - там таймер и много чего. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-23T16:09:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95925#p95925</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95924#p95924" />
			<content type="html"><![CDATA[<p>И ещё.</p><p>Сделай три таймера, по одному на каждое окно, а то можешь проскочить в момент открытия закрытия разных окон, что бы не писать сложную проверку.</p><p>1. Частота таймера не менее 5 секунд.<br />2. Я бы добавил внутри таймера, в цикле длительностью 2-3 секунды ожидание окна по <strong>While</strong> или <strong>Loop</strong> проверку на <strong> WinExist(&quot;имя окна&quot;)</strong> -&nbsp; для надёжности.</p><p>Да, первый мой ответ явный перебор, но это то что у меня было открыто... я дописывал скрипт.</p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-23T15:40:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95924#p95924</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95923#p95923" />
			<content type="html"><![CDATA[<p><strong>Indomito</strong>, ого, сколько строк! Я думал, что можно уложиться в 1-10 строчек. И мне кажется, что таки можно . )) Но спасибо, посмотрю что к чему, но на первый взгляд, страшновато выглядит для не сильно прошаренного в AHK человека. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Ага, а вот второе более понятно и компактно выглядит, спасибо, попробую так. )</p>]]></content>
			<author>
				<name><![CDATA[Remelibo]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=32496</uri>
			</author>
			<updated>2015-07-23T15:21:20Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95923#p95923</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95922#p95922" />
			<content type="html"><![CDATA[<p>Можно намного проще, сорри - погорячился. <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> </p><div class="codebox"><pre><code>;Обычный таймер
lTimer:
Thread, NoTimers
DetectHiddenWindows, on
;SetTitleMatchMode, 1 или что требуется
If (WinExist(&quot;окно1&quot;) || WinExist(&quot;окно2&quot;) || WinExist(&quot;окно3&quot;))
      {  
        Thread, NoTimers, False
        Return ; Одно из окон существует даже если оно скрыто
      }
    Else ;Ни одного окна нет
     {
       ;Сигнал к выходу
       ;Или просто...
       ExitApp
     }
Return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-23T15:21:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95922#p95922</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95919#p95919" />
			<content type="html"><![CDATA[<p>Где то... так <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p><p>Удалил - слишком сложная и объёмная проверка. <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2015-07-23T14:34:08Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95919#p95919</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Определение запущенных окон (League of Legends)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=95908#p95908" />
			<content type="html"><![CDATA[<p>Цель - сделать скрипт, который бы запускал League of Legends, вбивал логин/пароль, автоматически принимал игру по нажатию на кнопку (f11, например), а при закрытии игры - закрывался бы и скрипт.</p><p>Почти со всем перечисленным хоть и наверняка кривовато, но справился, кроме одного - что бы &quot;при закрытии игры - закрывался бы и скрипт&quot;. Проблема в том, что League of Legends имеет, по сути, 3 окна - LoL Patcher (игра обновляется), Клиент PvP.net (сам клиент из которого ищется игра и т.д.) и League of Legends (TM) Client (непосредственно игра). Когда одно окно закрывается, другое открывается.</p><p>Через WinWait и WinWaitClose можно реализовать отслеживание скорее всего. LoL Patcher только в начале вылезает, потом нужно отслеживать. По идее, нужно детектить есть ли в системе окно Клиент PvP.net или League of Legends (TM) Client и если нет ни одного - закрывать скрипт.</p><p>Сейчас мой корявенький скрипт выглядит так:</p><div class="codebox"><pre><code>#SingleInstance force

Run, &quot;%A_ScriptDir%\lol.launcher.exe&quot;

WinWait, LoL Patcher

if ErrorLevel
{
    MsgBox, Истекло время ожидания. ;Наверное, можно и без этого обойтись
    return
}
else
{
    Loop, 9999
        {
        sleep 2000
        ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\play.png ;Клик по кнопке &quot;играть&quot; в патчере (поиск по картинке).
        if ErrorLevel = 0
        
        {       
            MouseMove, FoundX, FoundY             
            sleep,1
            Click
            
            WinWait, LoL Patcher
            if ErrorLevel            
            {
                MsgBox, Истекло время ожидания.
                return
            }
            else
            {
            Loop, 9999
            {
            sleep 3000
            ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\nick.png ;Ищется картинка на экране логина (никнейм).
            if ErrorLevel = 0
            {       
            MouseMove, 400, 390
                
            sleep,1

            Send pass ;Вбивается пароль
            Send, {ENTER}
            return
            }
        }
        
        return
       }
       return
        }
    }
    return
}
return

 
F11:: ;Функция подтверждалки - нажимается кнопка &quot;Принять&quot; при нахождении матча (поиск по картинке)
    gojoin:=!gojoin

if gojoin

{

gosub, Accepter

sleep 100

SetTimer, Accepter, 2012

}

else

{

ToolTip

SetTimer, Accepter, off

}

Accepter:
ifWinActive, Клиент PvP.net ; Если активно окно клиента &quot;лиги&quot;

{

ToolTip, Accepter is active`nPress F11 to deactivate

ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\OK_button.png
    if ErrorLevel = 0
    {       
        MouseMove, FoundX+100, FoundY+40        
        sleep,1
        Click        
    }
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\OK_buttonflash.png
    if ErrorLevel = 0
    {       
        MouseMove, FoundX+100, FoundY+40     
        sleep,1
        Click        
    }
    return
}</code></pre></div><p>Наверняка есть что улучшить в коде, кроме детекта определения закрытия всех окон. Ещё проблемка со строкой ToolTip, Accepter is active`nPress F11 to deactivate - по нажатию F11, подтверждалка работает, после повторного нажатия F11, подтверждалка выключается, но надпись Accepter is active остаётся висеть на экране.</p>]]></content>
			<author>
				<name><![CDATA[Remelibo]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=32496</uri>
			</author>
			<updated>2015-07-23T12:25:00Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=95908#p95908</id>
		</entry>
</feed>
