<?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=8785</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8785&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?».]]></description>
		<lastBuildDate>Wed, 15 Oct 2014 15:28:41 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87385#p87385</link>
			<description><![CDATA[<p>Спасибо, теперь всё стало окончательно ясно и всё встало на свои места.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Wed, 15 Oct 2014 15:28:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87385#p87385</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87376#p87376</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>А объясните, пожалуйста, что делает проверка hwnd = A_ScriptHwnd?</p></blockquote></div><p>Сообщение WM_DEVICECHANGE рассылается всем окнам. В вашем скрипте их два: одно главное (скрытое), другое — которое вы создаёте. Отсюда и по два сигнала на каждое событие. Проверкой мы отсекаем все окна, кроме главного.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Кстати, а почему вы предложили такой порядок аргументов для WM_DEVICECHANGE()?</p></blockquote></div><p>Это порядок аргументов не WM_DEVICECHANGE, а <a href="http://ahkscript.org/docs/commands/OnMessage.htm#The_Functions_Parameters">OnMessage()</a>.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 15 Oct 2014 14:06:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87376#p87376</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87370#p87370</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, спасибо, теперь всё работает как надо. А объясните, пожалуйста, что делает проверка hwnd = A_ScriptHwnd? wm_devicechange без этой проверки ловил что ли и сообщения &quot;направленные&quot; другим hwnd кроме hwnd скрипта? я бы ещё понял, если бы сообщения отправлялись другим процессам, но ведь разница реально в том, что в коде самого скрипта: если в коде моего скрипта закомментировать большинство остальных строк - то удвоенные сообщения вновь превращаются в однократные, всё становится как надо.<br />Кстати, а почему вы предложили такой порядок аргументов для WM_DEVICECHANGE()? У <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480%28v=vs.85%29.aspx">майкрософта</a> указан другой.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Wed, 15 Oct 2014 12:18:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87370#p87370</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87336#p87336</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Срабатывает дважды.</p></blockquote></div><p>Добавьте в параметры:<br /></p><div class="codebox"><pre><code>WM_DEVICECHANGE(wp, lp, msg, hwnd)</code></pre></div><p>И измените условие:<br /></p><div class="codebox"><pre><code>if (hwnd = A_ScriptHwnd &amp;&amp; (wp = DBT_DEVICEARRIVAL || wp = DBT_DEVICEREMOVECOMPLETE)
   &amp;&amp; NumGet(lp+4, &quot;UInt&quot;) = DBT_DEVTYP_VOLUME)</code></pre></div><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>как timer будет работать ещё и параллельно с этим? возможны ли коллизии?</p></blockquote></div><p>Если, опять же, обработку событий ставить на таймер, всё должно быть в порядке.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 14 Oct 2014 15:57:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87336#p87336</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87330#p87330</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Просто попробуйте для начала встатвить в программу функцию в том виде, как в примере, без всяких дебагов и обработок, и добавьте по условию Soundbeep. Так проще всего отследить, сколько раз она будет сигналить.</p></blockquote></div><p>OutputDebug и/или listlines нагляднее. Срабатывает дважды.</p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Если между событиями — будет выполняться подпрограмма таймера по первому событию, новый вызов таймера будет буферизирован, и выполнится после завершения подпрограммы предыдущего вызова.<br />Если после обоих — будет обработано только последнее событие.</p></blockquote></div><p>У меня там ещё есть следилка за появлением/смертью процессов<br /></p><div class="codebox"><pre><code>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;
oSvc.ExecNotificationQueryAsync(createSink, &quot;select * from __InstanceCreationEvent &quot; Command)
oSvc.ExecNotificationQueryAsync(deleteSink, &quot;select * from __InstanceDeletionEvent &quot; Command)</code></pre></div><p>как timer будет работать ещё и параллельно с этим? возможны ли коллизии?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 14 Oct 2014 04:26:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87330#p87330</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87325#p87325</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Однократное подключение флешки (как и однократное её отключение) генерирует 2 записи в дебаг-лог</p></blockquote></div><p>Просто попробуйте для начала встатвить в программу функцию в том виде, как в примере, без всяких дебагов и обработок, и добавьте по условию Soundbeep. Так проще всего отследить, сколько раз она будет сигналить.</p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Возможны 2 варианта: таймер сработал между этими событиями; таймер сработал после обоих.<br />Что в этих случаях сделает скрипт?</p></blockquote></div><p>Если между событиями — будет выполняться подпрограмма таймера по первому событию, новый вызов таймера будет буферизирован, и выполнится после завершения подпрограммы предыдущего вызова.<br />Если после обоих — будет обработано только последнее событие.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 13 Oct 2014 17:50:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87325#p87325</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87323#p87323</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>вот этот же самый код, но вставленный в мой скрипт - почему-то после выполнения процитированного if снова возвращается к нему же</p></blockquote></div><p>Это я не совсем понял.</p></blockquote></div><p>Однократное подключение флешки (как и однократное её отключение) генерирует 2 записи в дебаг-лог, т.е. функция срабатывает дважды (уже с учётом условия If wp = 0x8000 || wp = 0x8004) на одно событие.</p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Но явная ошибка — помещать обработку события в ту же функцию, что его отлавливает. Обработка занимает время, в которое могут происходить новые события, и тут могут возникать сбои. В функции не должно быть ничего, кроме отлова события, а обработку лучше всего повесить на таймер.</p></blockquote></div><p>Я так и не разобрался с псевдо-многопоточностью в AHK. Я пробовал выносить обработку в отдельную функцию (не по таймеру) - работает так же.<br />Ну добавил бы я таймер - как скрипт бы повёл себя в случае, скажем, такой колизии: с разницей в долю секунды идёт сначала подключение, а потом отключение флешки.<br />Возможны 2 варианта: таймер сработал между этими событиями; таймер сработал после обоих.<br />Что в этих случаях сделает скрипт?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 13 Oct 2014 16:55:33 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87323#p87323</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87320#p87320</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>вот этот же самый код, но вставленный в мой скрипт - почему-то после выполнения процитированного if снова возвращается к нему же</p></blockquote></div><p>Это я не совсем понял. Но явная ошибка — помещать обработку события в ту же функцию, что его отлавливает. Обработка занимает время, в которое могут происходить новые события, и тут могут возникать сбои. В функции не должно быть ничего, кроме отлова события, а обработку лучше всего повесить на таймер.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 13 Oct 2014 15:53:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87320#p87320</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87315#p87315</link>
			<description><![CDATA[<p>Edit: оказалось, что ничего не в порядке: у меня ваш код в отдельном скрипте работает с однократным срабатыванием, а вот этот же самый код, но вставленный в мой скрипт - почему-то после выполнения процитированного if снова возвращается к нему же :-/<br />Если не трудно, то, кто-нибудь, пожалуйста, гляньте мой огромный и пока недоделанный <a href="http://pastebin.com/raw.php?i=1Ap9XVfN">скрипт</a>. Не понимаю в чём может быть дело :-/<br />в нём строка 100<br /></p><div class="codebox"><pre><code>OnMessage(0x219, &quot;WM_DEVICECHANGE&quot;)</code></pre></div><p>и строки 1059-1081 описывают функцию<br /></p><div class="codebox"><pre><code>WM_DEVICECHANGE(wp, lp){…}</code></pre></div><p>на строке 1079 идёт OutputDebug, который у меня срабатывает всегда дважды.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 13 Oct 2014 15:37:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87315#p87315</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87140#p87140</link>
			<description><![CDATA[<p>Чего-то странно я как-то тестировал. Похоже, я outputdebug ставил после этого условия, а не внутри него.<br />Всё в порядке, разобрался, спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Fri, 10 Oct 2014 15:11:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87140#p87140</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87138#p87138</link>
			<description><![CDATA[<p>Само сообщение <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480%28v=vs.85%29.aspx"><em>WM_DEVICECHANGE</em></a> может приходить несколько раз с разными параметрами. Но нам-то не нужно отлавливать все эти сообщения, а только с нужными описанными в функции параметрами:<br /></p><div class="codebox"><pre><code>if ((wp = DBT_DEVICEARRIVAL || wp = DBT_DEVICEREMOVECOMPLETE) &amp;&amp; NumGet(lp+4, &quot;UInt&quot;) = DBT_DEVTYP_VOLUME)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 10 Oct 2014 11:58:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87138#p87138</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87137#p87137</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, а как вы определили, что один? не по messagebox&#039;у ли? если так, то это ни о чём не говорит, т.к. messagebox паузит выполнение скрипта.<br />Я выполнял &quot;outputdebug, a drive (dis)appeared!&quot; и смотрел в debugview сколько же я таких сообщений получу; оказалось, что получаю их много.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Fri, 10 Oct 2014 11:51:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87137#p87137</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87136#p87136</link>
			<description><![CDATA[<p>Что вы называете onmessag&#039;ами? У меня при подключении флешки функция <em>WM_DEVICECHANGE()</em> сигнализирует один раз, при отключении — тоже один.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 10 Oct 2014 11:22:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87136#p87136</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87067#p87067</link>
			<description><![CDATA[<p>А почему при однократном подключении+отключении флешки генерируется так много одинаковых onmessage&#039;ей? 8 при отключении и 16-18 при подключении.<br />Можно ли как-то (возможно, по каким-то смежным событиям) добиться того, чтобы однократное подключение и однократное отключение генерировали только 1 событие?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 07 Oct 2014 06:38:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87067#p87067</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=83514#p83514</link>
			<description><![CDATA[<p>Да уж, <a href="http://www.youtube.com/watch?v=FutWFlnAH00">просто</a></p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Fri, 30 May 2014 06:35:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=83514#p83514</guid>
		</item>
	</channel>
</rss>
