<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=8056</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8056&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)».]]></description>
		<lastBuildDate>Fri, 02 Aug 2013 11:32:33 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=74186#p74186</link>
			<description><![CDATA[<p>Гм, видимо, это был какой-то глюк, раз баг на время исчез. Но сейчас он снова тут.<br />Начал дебажить и узнал, что в функции checkingAndMarking() попадают окна самих маркеров (ведь они тоже же AOT), а не тех окон, к которым они прилеплены.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Fri, 02 Aug 2013 11:32:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=74186#p74186</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=74056#p74056</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>2. У меня по-прежнему в полноэкранных приложениях (например, mpc-hc), если им выставить AOT флаг - показывается маркер. При этом внутри функции checkingAndMarking(hwnd) есть же проверка на полноэкранность</p></blockquote></div><p>Всё дело оказалось в том, что до сегодняшнего дня я не осознавал, что код<br /></p><div class="codebox"><pre><code>a := b :=</code></pre></div><p>не чистит переменные, а чистить их надо так:<br /></p><div class="codebox"><pre><code>a := b := &quot;&quot;</code></pre></div><p>Исправил все подобные чистки переменных в скрипте и этот баг пропал (:</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sun, 28 Jul 2013 00:02:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=74056#p74056</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73843#p73843</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>если заменить там на маленькую букву (не в слове DllCall, а в его первом параметре) - сразу перестают маркеры следить за окнами.</p></blockquote></div><p>Да, действительно, это так. Это не просто &quot;первый параметр&quot;, это название функции в dll, к которой обращается DllCall(). Оказывается, они регистрозависимые, раньше не знал об этом. Никогда просто не пытался написать их названия иначе, чем в MSDN. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 17 Jul 2013 18:26:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73843#p73843</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73826#p73826</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Нет, AHK — регистронезависимый язык, это повлиять не может, проблема в чём-то другом.</p></blockquote></div><p>Я у себя проверяю - если заменить там на маленькую букву (не в слове DllCall, а в его первом параметре) - сразу перестают маркеры следить за окнами. Меняю обратно - всё ок, следят. Проверь у себя, если не веришь.</p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Скрипт получился очень хорошим, вот только уже за дни его использования заметил 2 маленьких помарки, которые хотелось бы исправить, да не очень понимаю как</p></blockquote></div><p>Советую не заморачиваться. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Я пользусь вариантом скрипта, который следит только за теми окнами, которые сам отметил, и этого вполне достаточно, ведь в любом случае можно и присвоить, и снять этот стиль, независимо от изначального состояния окна.</p></blockquote></div><p>Да на самом деле, с течением времен всплыли ещё множество проблем:<br />1. список исключений срабатывает по частичному совпадению: от этого окна некоторых программ (вроде окна tabsrmm контейнера в miranda im/ng) нельзя пришпилить, т.к. у них ahk_class #32700. Если убрать из исключений #327 - то во маркер будет рисоваться у каждого контекстного меню в системе.<br />2. скрипт можно повесить: достаточно в miranda&#039;е открыть окно history++, включить там поиск (ctrl+f) и навести курсор на кнопку &quot;вперёд&quot; или &quot;назад&quot;: на месте попапа, всплывающего для них появляется маркер, сам попап исчезает, а маркер остаётся навсегда и после этого скрипт перестаёт работать, а чтобы его рестартнуть надо либо убивать его процесс (а они все autohotkey.exe блин, поэтому приходится его искать среди всех запущенных), либо через контекстное меню, но при открытии контекстного меню - всё его содержимое отображается чёрным треугольником, можно только по памяти найти позицию менюитема &quot;рестарт скрипта&quot;.<br />3. Очень редко, скрипт застревает на каком-то вечном лупе, это настолько редко, что я даже не пытался дебажить.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 16 Jul 2013 23:35:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73826#p73826</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73677#p73677</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Там где DllCall() - первый параметр у тебя идёт с большой буквы, если сменить на маленькую - маркер перестаёт следить за перемещениями окон.</p></blockquote></div><p>Нет, AHK — регистронезависимый язык, это повлиять не может, проблема в чём-то другом.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Скрипт получился очень хорошим, вот только уже за дни его использования заметил 2 маленьких помарки, которые хотелось бы исправить, да не очень понимаю как</p></blockquote></div><p>Советую не заморачиваться. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Я пользусь вариантом скрипта, который следит только за теми окнами, которые сам отметил, и этого вполне достаточно, ведь в любом случае можно и присвоить, и снять этот стиль, независимо от изначального состояния окна.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 12 Jul 2013 09:50:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73677#p73677</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73426#p73426</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Нет, это проверка, не является ли рассматриваемое окно принадлежащим скрипту, т. е. собственно одной из меток. В этом случае переходим к следующему.</p></blockquote></div><p>Да, я не правильно понимал этот кусок документации:<br />http://l.autohotkey.net/docs/commands/Process.htm<br /></p><div class="quotebox"><blockquote><p>CMD (param) &gt; Exist (possible value): Sets ErrorLevel to the Process ID (PID) if a matching process exists, or 0 otherwise. If the PID-or-Name parameter is blank, the script&#039;s own PID is retrieved.</p></blockquote></div><p>оказывается, в ErrorLevel записывается PID скрипта, а не просто информация о том, что он запущен (т.е. просто 1), что будь оно так - было бы бесполезно в принципе.</p><p>Если честно - то и без этих проверок всё работает: я так понимаю, что эта проверка нужна была ради избежания коллизий на случай, если вдруг сам маркер (это же GUI окно, просто особенное) станет активным окном то пользователь может попытаться добавить AOT флаг ему, а не окну к которому он прикреплён.<br />А если вдруг я захочу приделать скрипту какой-то свой нормальные GUI для чего-то (например, для настроек) - то почему это я не должен иметь возможность сделать и его AOT?<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>А в чём разница, не заметил?</p></blockquote></div><p>Там где DllCall() - первый параметр у тебя идёт с большой буквы, если сменить на маленькую - маркер перестаёт следить за перемещениями окон.</p><p>Скрипт получился очень хорошим, вот только уже за дни его использования заметил 2 маленьких помарки, которые хотелось бы исправить, да не очень понимаю как:<br />1. Если до старта скрипта уже есть какие-то 2 окна с AOT флагом и одно из них активно и находится поверх другого, то при старте скрипта активное окно почему-то скрывается за неактивным. При этом активное окно по-прежнему остаётся активным.<br />Я уже вычислил, что похоже это из-за работы функции checkingAndMarking(hwnd).<br />2. У меня по-прежнему в полноэкранных приложениях (например, mpc-hc), если им выставить AOT флаг - показывается маркер. При этом внутри функции checkingAndMarking(hwnd) есть же проверка на полноэкранность:<br /></p><div class="codebox"><pre><code>If (ExStyle &amp; WS_EX_TOPMOST)
{
    ...
    If (WWin == A_ScreenWidth &amp;&amp; HWin == A_ScreenHeight)    ; Fullscreen check: such windows should not get a marker.
            Return
    ...
}</code></pre></div><p>Но (ExStyle &amp; WS_EX_TOPMOST) возвращает true почему-то только при снятии АОТ метки. Если же перед этим условием поставить &quot;!&quot; (т.е. логически переключить его) - скрипт пятит.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 02 Jul 2013 16:02:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73426#p73426</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73424#p73424</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p><strong>teadrinker</strong>,<br />а для чего в твоём скрипте вот эти строки?<br /></p><div class="codebox"><pre><code>Process, Exist ; это же проверка &quot;а запущен ли процесс этого скрипта?&quot;, она же всегда будет выдавать ErrorLevel := false, ведь в момент, когда она выдала бы true - скрипт то уже не выполняется.
ScriptPid := ErrorLevel
...
if (PID = ScriptPid)
         continue
</code></pre></div><p>?</p></blockquote></div><p>Нет, это проверка, не является ли рассматриваемое окно принадлежащим скрипту, т. е. собственно одной из меток. В этом случае переходим к следующему.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Так вот я перестарался с исправлением заглавных букв и у меня вместо ... получилось</p></blockquote></div><p>А в чём разница, не заметил?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 02 Jul 2013 14:53:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73424#p73424</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73352#p73352</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Ну так перемещение окна же делается другим скриптом, значит в другом потоке (однопоточность — это внутри одного скрипта), соответственно это повлиять никак не должно.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>+ я немного запутался в версиях твоего скрипта (+ я же их ещё под себя переделывал)</p></blockquote></div><p>Тут уж ничем не могу помочь <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Кстати.</div><div class="fancy_spoiler"><p>Я люблю своё оформление кода и переделывал твоё оформление под своё.<br />Люблю правило, что функции (как и переменные) следует именовать используя camelCase.</p><p>Так вот я перестарался с исправлением заглавных букв и у меня вместо<br /></p><div class="codebox"><pre><code>setWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
    Return DllCall(&quot;SetWinEventHook&quot; , UInt, eventMin, UInt, eventMax, Ptr, hmodWinEventProc, Ptr, lpfnWinEventProc, UInt, idProcess, UInt, idThread, UInt, dwFlags, Ptr)
}</code></pre></div><p>получилось<br /></p><div class="codebox"><pre><code>setWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
    Return DllCall(&quot;setWinEventHook&quot; , UInt, eventMin, UInt, eventMax, Ptr, hmodWinEventProc, Ptr, lpfnWinEventProc, UInt, idProcess, UInt, idThread, UInt, dwFlags, Ptr)
}</code></pre></div><p>И именно из-за этого переставали маркеры следить за перемещением окон при их передвижении. (:</p></div></div>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 27 Jun 2013 22:01:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73352#p73352</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=73344#p73344</link>
			<description><![CDATA[<p><strong>teadrinker</strong>,<br />а для чего в твоём скрипте вот эти строки?<br /></p><div class="codebox"><pre><code>Process, Exist ; это же проверка &quot;а запущен ли процесс этого скрипта?&quot;, она же всегда будет выдавать ErrorLevel := false, ведь в момент, когда она выдала бы true - скрипт то уже не выполняется.
ScriptPid := ErrorLevel
...
if (PID = ScriptPid)
         continue
</code></pre></div><p>?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 27 Jun 2013 14:12:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=73344#p73344</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69918#p69918</link>
			<description><![CDATA[<p>Слили, жмёте горячую клавишу, запускается псевдопоток горячей клавиши.<br />Запущенный псевдопоток не может быть прерван иным псевдопотоком в течении 15мс от запуска или на протяжении выполнения в псевдопотоке 1000 строк кода.<br /></p><div class="quotebox"><blockquote><p>By default, every newly launched thread is uninterruptible for a Duration of 15 milliseconds or a LineCount of 1000 script lines,</p></blockquote></div><p>Псевдопотоки выполняются «параллельно», но не одновременно, если нажатие горячей клавиши произойдёт во время выполнения команды в ином псевдопотоке — начало выполнения подпрограммы горячей клавиши будет отложено до того момента как активный псевдопоток проработает более 15мс, либо выполнит 1000 строк кода, либо закончит своё выполнение, либо произведёт вызов sleep.<br />Для понимания:<br /></p><div class="codebox"><pre><code>Thread, Interrupt, 2000

SetTimer beep, 500
return

beep:
    i++
    ToolTip % i
    SoundBeep
    return

Space::
    SoundBeep 750
    sleep 2000
    SoundBeep 750
    return</code></pre></div><p>Запустите код, отметьте периодичность звуковых сигналов, нажмите пробел в момент когда должен прозвучать сигнал. сделайте вывод. Подождите 2 секунды, попробуйте нажать пробел во время паузы между звуковыми сигналами. сделайте вывод <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>GoSub не помогут, две «насыщенные действиями, не использующие sleep» подпрограммы могут эффективно работать одновременно,&nbsp; но не «параллельно», как это предлагает autohotkey.</p></div></div>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Sun, 03 Mar 2013 23:26:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69918#p69918</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69917#p69917</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Ну так перемещение окна же делается другим скриптом</p></blockquote></div><p>нет, я их слил воедино.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sun, 03 Mar 2013 22:11:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69917#p69917</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69808#p69808</link>
			<description><![CDATA[<p>Ну так перемещение окна же делается другим скриптом, значит в другом потоке (однопоточность — это внутри одного скрипта), соответственно это повлиять никак не должно.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>+ я немного запутался в версиях твоего скрипта (+ я же их ещё под себя переделывал)</p></blockquote></div><p>Тут уж ничем не могу помочь <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 27 Feb 2013 21:58:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69808#p69808</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69807#p69807</link>
			<description><![CDATA[<p>Хм, тут всё немного сложней, чем просто необработка WinMove:<br />Дело может быть связанос однопоточностью AHK: когда выполняется мой хоткей - до других строк кода, поток может попросту не доходить, а значит нужны gosub (но куда?).</p><p>+ я немного запутался в версиях твоего скрипта (+ я же их ещё под себя переделывал)</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Wed, 27 Feb 2013 21:52:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69807#p69807</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69805#p69805</link>
			<description><![CDATA[<p>То-есть, фактически вопрос в том, что если двигать окно с помощью WinMove, метка остаётся на месте? Это не так. Проверить можно очень просто. Добавляем в скрипт такую горячую клавишу:<br /></p><div class="codebox"><pre><code>F10:: 
    WinGetPos, X, Y,,, ahk_class Notepad
    WinMove, ahk_class Notepad,, X + 50, Y + 50
    return</code></pre></div><p>Полный код:</p><div class="codebox"><pre><code>#NoEnv
SetBatchLines, -1
SetWinDelay, 0

Hotkey := &quot;!1&quot;   ; указать горячую клавишу для установки/снятия стиля WS_EX_TOPMOST

; сдвиг окна-метки относительно верхнего левого угла окна-хозяина
global ShiftX := 5, ShiftY := 5
, GUIs := [], ScriptPid, Exceptions, WS_EX_TOPMOST := 0x8
, EVENT_OBJECT_SHOW := 0x8002, EVENT_OBJECT_HIDE := 0x8003, OBJID_WINDOW := 0
, EVENT_OBJECT_LOCATIONCHANGE := 0x800B, WINEVENT_SKIPOWNPROCESS := 0x2

; сюда добавляем названия классов окон (или их часть), которые нужно исключить из мониторинга
Exceptions := [&quot;Button&quot;, &quot;tooltip&quot;, &quot;shadow&quot;, &quot;TaskListThumbnailWnd&quot;, &quot;TaskListOverlayWnd&quot;, &quot;Progman&quot;
                  , &quot;ComboLBox&quot;, &quot;Shell_TrayWnd&quot;, &quot;TTrayAlert&quot;, &quot;#327&quot;, &quot;NotifyIconOverflowWindow&quot;]

; отслеживаем появление и скрытие окон
HWINEVENTHOOK1 := SetWinEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_HIDE, 0
                     , RegisterCallback(&quot;WatchingShowHideWindow&quot;, &quot;F&quot;), 0, 0, WINEVENT_SKIPOWNPROCESS)
; отслеживаем изменение позиции окон                             
HWINEVENTHOOK2 := SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE, 0
                     , RegisterCallback(&quot;WatchingChangeLocation&quot;, &quot;F&quot;), 0, 0, WINEVENT_SKIPOWNPROCESS)
OnExit, Exit

Process, Exist
ScriptPid := ErrorLevel

Hotkey, %Hotkey%, SetDeleteOnTop, On

; таймер будет отслеживать AlwaysOnTop статус всех окон, кроме добавленных в Exceptions
SetTimer, MonitoringWindows, 1000
return

Esc::ExitApp

F10:: 
    WinGetPos, X, Y,,, ahk_class Notepad
    WinMove, ahk_class Notepad,, X + 50, Y + 50
    return

MonitoringWindows:
   MonitoringWindows()
   return
   
SetDeleteOnTop:
   SetDeleteOnTop()
   return

Exit:
   DllCall(&quot;UnhookWinEvent&quot;, Ptr, HWINEVENTHOOK1)
   DllCall(&quot;UnhookWinEvent&quot;, Ptr, HWINEVENTHOOK2)
   GUIs := &quot;&quot;
   ExitApp

MonitoringWindows()
{
   for k, v in GUIs
      if !WinExist(&quot;ahk_id&quot; v.Parent)
         AlwaysOnTopOff(v.Parent)
      
   WinGet, List, List
   Loop % List
   {
      ID := List%A_Index%
      
      WinWait, ahk_id %ID%
      WinGet, PID, PID
      if (PID = ScriptPid)
         continue
      
      for k, v in GUIs
         if (v.Parent = ID)
         {
            WinGet, ExStyle, ExStyle
            if !(ExStyle &amp; WS_EX_TOPMOST)
               AlwaysOnTopOff(ID)
            continue 2
         }
         
      CheckingAndMarking(ID)
   }
}

SetDeleteOnTop()
{
   WinGet, ID,, A
   WinGetPos, XWIn, YWin,,, ahk_id %ID%
   WinGetClass, Class, ahk_id %ID%
   
   for k, v in Exceptions
      if InStr(Class, v)
      {
         CoordMode, ToolTip
         ToolTip, Это окно класса %Class% исключено из мониторинга!, XWIn, YWin
         Sleep, 1500
         ToolTip
         return
      }
   
   for k, v in GUIs
      if (v.Parent = ID)
      {
         AlwaysOnTopOff(ID)
         return
      }
      
   WinSet, AlwaysOnTop, On, ahk_id %ID%
   CreateMarker(ID, XWin+ShiftX, YWin+ShiftY)
}

CreateMarker(OwnerID, X, Y)
{
   static WS_EX_TRANSPARENT := 0x20
   
; устанавливая расширенный стиль WS_EX_TRANSPARENT делаем окно-метку прозрачным для мыши
; опцией Owner%OwnerID% делаем GUI принадлежащим активному окну, тогда GUI всегда будет поверх окна-хозяина
   Gui, New, +E%WS_EX_TRANSPARENT% -Caption +LastFound +AlwaysOnTop +ToolWindow +hwndhGui +Owner%OwnerID%
   WinSet, Transparent, 200  ; прозрачность окна-метки, от 0 до 255
   Gui, Color, Red
   Gui, Show, NA w12 h12 x%X% y%Y%
   
   GUIs.Insert({Parent: OwnerID, Owned: hGui})
}

WatchingShowHideWindow(hWinEventHook, event, hwnd, idObject)
{
   if (idObject != OBJID_WINDOW)
      return
   
   if (event = EVENT_OBJECT_SHOW)
      CheckingAndMarking(hwnd)
   
   else if (event = EVENT_OBJECT_HIDE)
   {
      if !WinExist(&quot;ahk_id&quot; hwnd)
         AlwaysOnTopOff(hwnd)
   }
}

CheckingAndMarking(hwnd)
{
   static WS_POPUP := 0x80000000, WS_CAPTION := 0xC00000, WS_BORDER := 0x800000
   
   WinWait, ahk_id %hwnd%
   WinGetClass, Class
   for k, v in Exceptions
      if InStr(Class, v)
         return
      
   WinGet, ExStyle, ExStyle
   if (ExStyle &amp; WS_EX_TOPMOST)
   {
      WinGet, Style, Style
      if (Style &amp; WS_POPUP &amp;&amp; !(Style &amp; WS_CAPTION) &amp;&amp; !(Style &amp; WS_BORDER))
         return
      
;     ToolTip % Class   ; раскомментировать строку для определения класса и добавления в Exceptions
      WinGetPos, XWin, YWin, WWin, HWin
      
      if (WWin = A_ScreenWidth &amp;&amp; HWin = A_ScreenHeight)   ; проверка на полноэкранные окна
         return
      
      CreateMarker(hwnd, XWin+ShiftX, YWin+ShiftY)
   }
}

WatchingChangeLocation(hWinEventHook, event, hwnd, idObject)
{
   if (idObject != OBJID_WINDOW)
      return
  
   static i := 0, OwnedWindowID, MonitoredWindowID
   for k, v in GUIs
      if (v.Parent = hwnd)
      {
         OwnedWindowID := v.Owned
         MonitoredWindowID := v.Parent
         SetTimer, WatchingMove, 10
         break
      }
   return
   
WatchingMove:
   WinGetPos, X, Y,,, ahk_id %MonitoredWindowID%
   WinMove, ahk_id %OwnedWindowID%,, X+ShiftX, Y+ShiftY
   
   if (i++ = 30)
   {
      i := 0
      SetTimer, WatchingMove, Off
   }
   return
}

AlwaysOnTopOff(hwnd)
{
   for k, v in GUIs
      if (v.Parent = hwnd)
      {
         WinSet, AlwaysOnTop, Off, ahk_id %hwnd%
         Gui, % v.Owned &quot;:Destroy&quot;
         GUIs.Remove(k)
         break
      }
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall(&quot;SetWinEventHook&quot; , UInt, eventMin, UInt, eventMax
                                    , Ptr, hmodWinEventProc, Ptr, lpfnWinEventProc
                                    , UInt, idProcess, UInt, idThread
                                    , UInt, dwFlags, Ptr)
}</code></pre></div><p>Запускаем скрипт, открываем блокнот, присваиваем его окну метку (Alt + 1), нажимаем F10. Метка передвигается вместе с окном, независимо от того, активно оно, или нет. Т. е. ошибка где-то в твоей интерпретации моего скрипта.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 27 Feb 2013 16:45:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69805#p69805</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: пририсовывать alwaysOnTop окнам кружок в углу окна (GDI+)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69801#p69801</link>
			<description><![CDATA[<p>Заметил баг при взаимодействии с другим скриптом:<br /></p><div class="codebox"><pre><code>XButton2 &amp; LButton::KDE_WinMove(&quot;LButton&quot;)
KDE_WinMove(sButton)
{
    SetWinDelay, 0
    CoordMode, Mouse
    MouseGetPos, x1, y1, id
    WinExist(&quot;ahk_id&quot; . id)
    WinGetClass, winClass
    WinGet, maximized, MinMax
    If (!GetKeyState(sButton, &quot;P&quot;)) || (winClass == &quot;WorkerW&quot;) || (maximized)
        Exit
    WinGetPos, winX1, winY1
    While GetKeyState(sButton, &quot;P&quot;)
    {
        MouseGetPos, x2, y2
        x2 -= x1, y2 -= y1, winX2 := winX1 + x2, winY2 := winY1 + y2
        WinMove,,, winX2, winY2
        Sleep 15
    }
    Gosub, CleanVars
}</code></pre></div><p>Я использую этот код для того, чтобы перемещать окна за любую их часть (неактивные (без их активации) и активные). И при таком перетаскивании - индикатор остаётся на старом месте. Не могли бы вы это подправить?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Wed, 27 Feb 2013 13:44:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69801#p69801</guid>
		</item>
	</channel>
</rss>
