<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=8790</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8790&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: можно ли исп-ть OnMessage() для отслеживания процессов?».]]></description>
		<lastBuildDate>Mon, 05 Oct 2015 23:52:03 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=97922#p97922</link>
			<description><![CDATA[<p>Я долго не мог понять почему у меня в скрипте в обновляемом списке где должны отображаться только живые процессы - собирались и &quot;зомби&quot;, пока не начал отладку. Оказалось, что дело в этом куске кода:<br /></p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><div class="codebox"><pre><code>ProcessDelete_OnObjectReady(obj)
{
   Process := obj.TargetInstance
   TrayTip, Завершён процесс, % &quot;PID = &quot; Process.ProcessID &quot;`nИмя = &quot; Process.Name &quot;`nКомандная строка = &quot; Process.CommandLine
}</code></pre></div></blockquote></div><p>В этой функции я добавил вывод отладочной информации (.processID, .commandLine и .executablePath процессов) через Outputdebug.<br />Оказалось, что в некоторых случаях при смерти процессов ahk-скриптов (у которых при запуске были заполнены все данные: и .processID, и .commandLine, и .executablePath) почему-то .commandLine и .executablePath становятся пустыми.</p><p>Такое происходит не всегда, довольно редко, с одними и теми же скриптами, с которыми в другие разы всё ок. Закономерностей и взаимосвязей этого явления с чем-либо не обнаружил.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 05 Oct 2015 23:52:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=97922#p97922</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90202#p90202</link>
			<description><![CDATA[<p>Чего-то я очень не внимательный. Визуально текст оказался похожим, а на самом деле это разные оповещения были от разных функций (имена длинные и визуально похожие). Всё срабатывает однократно, извините за беспокойство.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 08 Jan 2015 14:41:25 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90202#p90202</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90200#p90200</link>
			<description><![CDATA[<p>К количеству окон у процесса этот метод не имеет отношения.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 08 Jan 2015 14:12:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90200#p90200</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90199#p90199</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong>, я и с этим ошибся, но по большому счёту это и не важно. Не иконка в трее, а просто у любого процесса есть своё встроенное окно. + доп. окна создаются если использовать, например gdi+ полотна (без привязки к каким-то окнам).<br />Вопрос в том как бы отфильтровать, дублирующиеся сообщения у вышеобозначенной функции? На MSDN поискал - но ничего не понял / не нашёл / вроде как нашёл, что у этой функции нет аттрибута hwnd. Help!</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 08 Jan 2015 14:06:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90199#p90199</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90177#p90177</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>У меня в скрипте как раз 3 окна: иконка в трее, основное GUI окно и дополнительное GUI окно.</p></blockquote></div><p>А причём тут иконка в трее?<br /></p><div class="codebox"><pre><code>
#NoTrayIcon
DetectHiddenWindows on
WinGet, hwnd, List, % &quot;ahk_pid &quot; DllCall(&quot;GetCurrentProcessId&quot;)
Loop % hwnd
{
    WinGetClass, Class, % &quot;ahk_id&quot; hwnd%A_Index% 
    WinGetTitle, Title, % &quot;ahk_id&quot; hwnd%A_Index% 
    MsgBox % Title &quot;`n&quot; Class
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Thu, 08 Jan 2015 10:25:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90177#p90177</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90172#p90172</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Нет, такого не было. OnMessage() отлавливает только сообщения, посланные окнам своего процесса.</p></blockquote></div><p>А, точно-точно. Там немножко другой нюанс был: там сообщения дублировались из-за того, что у моего скрипта не одно, а несколько окон и сообщение отправляется каждому окну.<br />Исправили тогда это всё заменой WM_DEVICECHANGE(wp, lp) на WM_DEVICECHANGE(wp, lp, msg, hwnd) + проверкой if (hwnd = A_ScriptHwnd).</p><p>Касательно минимального кода - увы, это очень проблематично, но я в функцию ProcessCreate_OnObjectReady(Obj){} добавил Process := obj.TargetInstance + outputdebug, % Process.ExecutablePath и вижу, что при однократном запуске одного скрипта - функция вызывается трижды. У меня в скрипте как раз 3 окна: иконка в трее, основное GUI окно и дополнительное GUI окно.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 08 Jan 2015 09:43:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90172#p90172</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90168#p90168</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>у меня на появление 1 нового процесса ProcessCreate_OnObjectReady() срабатывает несколько раз.</p></blockquote></div><p>Приведите минимальный код, который демонстрирует проблему, у меня срабатывает как положено, один раз на каждый процесс.<br /></p><div class="quotebox"><blockquote><p>Аналогичная проблема с WM_DEVICECHANGE() решилась добавкой фильтрации по hwnd (т.е. он ловил и аналогичные сообщения, которые отправлялись чужим окнам (чужих приложений))</p></blockquote></div><p>Нет, такого не было. OnMessage() отлавливает только сообщения, посланные окнам своего процесса.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 08 Jan 2015 02:46:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90168#p90168</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=90164#p90164</link>
			<description><![CDATA[<p>Вроде научился правильно использовать Critical.<br />Но вот новый вопрос:<br />у меня на появление 1 нового процесса ProcessCreate_OnObjectReady() срабатывает несколько раз.<br />Аналогичная проблема с WM_DEVICECHANGE() решилась добавкой фильтрации по hwnd (т.е. он ловил и аналогичные сообщения, которые отправлялись чужим окнам (чужих приложений)), а как здесь добавить аналогичную фильтрацию?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 08 Jan 2015 01:45:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=90164#p90164</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76743#p76743</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, возник новый вопрос по предложенному тобой коду:<br />если я убиваю/запускаю пачку процессов сразу, то как работают эти функции (ProcessCreate_OnObjectReady и ProcessDelete_OnObjectReady)? Судя по тому, что ни одно из сообщений не пропускается - я предполагаю, что существует какая-то очередь, где они дожидаются момента, когда скрипт их обработает. Так ли это?<br />Я повесил во внутрь этих функций вызов другой функции, которая парсит массивы и делает кучу сравнений, обновляет массивы и список (ListView) и т.п. и я боюсь, что при объёмных массивах на всё это будет уходить достаточно много времени.<br />Во-первых, я боюсь, что это вызовет какие-то конфликты, т.к. я не знаю в какой из моментов начинает обрабатываться следующий вызов ProcessCreate_OnObjectReady или ProcessDelete_OnObjectReady из существующей очереди.<br />Во-вторых, вызов этой функции (которая парсит массивы и т.п.) - в любом случае лучше бы делать не каждый раз, при обработке вызовов ProcessCreate_OnObjectReady/ProcessDelete_OnObjectReady, а один раз спустя секунду после обработки последнего из всей пачки этих вызовов. Т.е. если в течение секунды с момента обработки предыдущего вызова - появляется новый, то таймер надо заново &quot;завести&quot; на ожидание секунды уже с момента этого вызова и т.д.<br />Можно ли это как-то сделать? Как?<br />Просто не хочется заводить постоянный таймер с выполнением периодических проверок.</p><p>Как идея по поводу того, как это реализовать у меня есть только такое:<br />добавить в во внутрь ProcessCreate_OnObjectReady и ProcessDelete_OnObjectReady<br /></p><div class="codebox"><pre><code>thisTime := A_Now 
SetTimer, timer, 500</code></pre></div><p>и отдельно создать ярлык примерно следующего содержания для вызова этим таймером:<br /></p><div class="codebox"><pre><code>timer:
if (thisTime+500 &lt; A_Now)
     sleep 500
Else
     funcCall()
SetTimer, timer, off
Return</code></pre></div><p>Но я не уверен, что во время этого Sleep 500 скрипт не будет вообще приостановлен, а сможет обрабатывать очередь вызовов тех функций.</p><p>Или это делается иначе? Признаться, я не до конца понимаю как работает пример 3 из <a href="http://l.autohotkey.net/docs/commands/SetTimer.htm">справки</a>, но на вид - это как раз аналогично моей проблеме.</p><p>Может Critical тут как-то поможет?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 31 Oct 2013 02:28:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76743#p76743</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76600#p76600</link>
			<description><![CDATA[<p>Проблема более не актуальна.<br />Я плохо умел работать с массивами, но сейчас, вроде, стал получше понимать работу объектов.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 28 Oct 2013 18:28:38 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76600#p76600</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76596#p76596</link>
			<description><![CDATA[<p>Не совсем ясна суть вопроса. Если ты знаешь, как получить PID и ExecutablePath, то в чём проблема занести/удалить их в свой массив?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 28 Oct 2013 16:30:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76596#p76596</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76286#p76286</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Почему же, AHK может пользоваться средствами WMI через COM, здесь уже была куча примеров. Собственно, вот:<br /></p><div class="codebox"><pre><code>#Persistent

OnlyAHK := 0   ; чтобы отслеживать только процессы AutoHotkey.exe — 1, иначе — 0

oSvc := ComObjGet(&quot;winmgmts:&quot;)
ComObjConnect(createSink := ComObjCreate(&quot;WbemScripting.SWbemSink&quot;), &quot;ProcessCreate_&quot;)
ComObjConnect(deleteSink := ComObjCreate(&quot;WbemScripting.SWbemSink&quot;), &quot;ProcessDelete_&quot;)

Command := &quot;Within 1 Where TargetInstance ISA &#039;Win32_Process&#039;&quot;
   . (OnlyAHK ? &quot; And TargetInstance.Name = &#039;AutoHotkey.exe&#039;&quot; : &quot;&quot;)
oSvc.ExecNotificationQueryAsync(createSink, &quot;select * from __InstanceCreationEvent &quot; Command)
oSvc.ExecNotificationQueryAsync(deleteSink, &quot;select * from __InstanceDeletionEvent &quot; Command)

ProcessCreate_OnObjectReady(obj)
{
   Process := obj.TargetInstance
   TrayTip, Новый процесс, % &quot;PID = &quot; Process.ProcessID &quot;`nИмя = &quot; Process.Name &quot;`nКомандная строка = &quot; Process.CommandLine
}

ProcessDelete_OnObjectReady(obj)
{
   Process := obj.TargetInstance
   TrayTip, Завершён процесс, % &quot;PID = &quot; Process.ProcessID &quot;`nИмя = &quot; Process.Name &quot;`nКомандная строка = &quot; Process.CommandLine
}</code></pre></div></blockquote></div><p>А интересный код. К сожалению, я не знаю о существовании каких-либо туториалов (даже на английском) по работе с WMI, с COM и с объектами (про работу с объектами есть обычная документации, но она не изобилует примерами и после её тщательного прочтения - я ничего не понял) в AHK, потому прошу ещё помочь.</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;полная версия объяснения проблемы</div><div class="fancy_spoiler"><p>Я все эти вопросы задаю с целью улучшить работу своего <a href="http://forum.script-coding.com/viewtopic.php?id=8724">MasterScript</a> скрипта, который сейчас работает таким образом:<br />есть label (вызываемый периодически, по таймеру) который содержит <strong>For Process In ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process&quot;)</strong>, которая наполняет 2 массива данными: 1 для информации обо всех процессах, 1 для информации только о запущенных ahk-скриптах.</p><p>Зачем мне нужны эти массивы? Коротко объяснить не получится, надо сначала рассказать что дальше делает скрипт с этими данными:</p><p>Затем из &quot;скриптового&quot; массива собираются PIDы всех процессов в 1 однострочную переменную, где все PIDы отделены друг от друга трубой &quot;|&quot;.<br />Эта переменная каждый раз бэкапится и потом производится сравнение текущей &quot;свежей&quot; версии этой переменной с её бэкапом.<br />При этом выявляется разницу между ними (появились ли новые PIDы? умерли ли какие-то из старых PIDов?).<br />По этой выявленной разнице скрипт принимает решение обновлять ли ListView со списком запущенных скриптов, и если обновлять, то - как это сделать? (нужно ли удалить какие-то строки? если да, то какие? нужно ли добавить новых строк? если да, то с каким содержимым?)<br />В случае с удалением строк - проблем нет, а вот в случае с добавлением новых - информация об их содержимом как раз и берётся из &quot;скриптового&quot; массива.</p><p>В принципе, на этом этапе мне уже &quot;скриптовый&quot; массив и не нужен, если я буду брать информацию из твоей функции ProcessCreate_OnObjectReady(obj), с этим я определился.</p><p>Тут проблема с другим массивом: &quot;общепроцессный&quot; массив нужен для работы фичи &quot;Process Assistant&quot; (про работу этой фичи рассказано в теме моего скрипта) и мне нужно, чтобы этот массив всегда содержал актуальную информацию, т.е. чтобы твои функции ProcessDelete_OnObjectReady(obj) и ProcessCreate_OnObjectReady(obj) соответствующим образом обновляли этот массив.</p><p>Как в таком случае правильно переписать функции ProcessDelete_OnObjectReady(obj) и ProcessCreate_OnObjectReady(obj), чтобы они обновляли существующий массив со списком данных обо всех процессах?<br />Массив многомерный: состоит из [index, &quot;pid&quot;] := Process.ProcessId и [index, &quot;exe&quot;] := Process.ExecutablePath.<br />Ключевое поле в массиве - связка [index, &quot;pid&quot;] процесса.<br />Если это удобней делать не массивами, а объектами (хотя и массивы, вроде бы, - это частный случай объектов) - покажи, пожалуйста, как их наполнять и как с ними работать (получать содержимое определённой ячейки).</p></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;tl;dr версия проблемы</div><div class="fancy_spoiler"><p>как правильно переписать функции ProcessDelete_OnObjectReady(obj) и ProcessCreate_OnObjectReady(obj), чтобы они обновляли существующий массив со списком данных обо всех процессах?<br />Массив многомерный: состоит из [index, &quot;pid&quot;] := Process.ProcessId и [index, &quot;exe&quot;] := Process.ExecutablePath.<br />Ключевое поле в массиве - связка [index, &quot;pid&quot;] процесса.<br />Если это удобней делать не массивами, а объектами (хотя и массивы, вроде бы, - это частный случай объектов) - покажи, пожалуйста, как их наполнять и как с ними работать (получать содержимое определённой ячейки).</p></div></div>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 21 Oct 2013 15:17:33 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76286#p76286</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76197#p76197</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Понял. Спасибо за ЛикБез <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 20 Oct 2013 14:12:05 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76197#p76197</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76196#p76196</link>
			<description><![CDATA[<p>Отслеживать — получать информацию о сообщениях (или перехватывать их), отправленных окнам чужих процессов, а получать можно сообщения, отправленные окнам своего процесса. &quot;Сообщение о событии&quot; — это неясный термин, есть просто сообщения, несущие какую-то информацию.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 20 Oct 2013 14:09:22 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76196#p76196</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: можно ли исп-ть OnMessage() для отслеживания процессов?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=76195#p76195</link>
			<description><![CDATA[<p>Ещё один, наверняка глупый вопрос:<br /></p><div class="quotebox"><blockquote><p>Можно ли отслеживать создание/завершение процессов</p></blockquote></div><p>...<br /></p><div class="quotebox"><blockquote><p>а при создании/завершении процессов никаких сообщений не рассылается.</p></blockquote></div><p>В чём отличие понятий - &quot;отслеживать событие&quot; и &quot;получать сообщения о событии&quot;?</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 20 Oct 2013 14:05:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=76195#p76195</guid>
		</item>
	</channel>
</rss>
