<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8785&amp;type=atom" />
	<updated>2014-10-15T15:28:41Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=8785</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87385#p87385" />
			<content type="html"><![CDATA[<p>Спасибо, теперь всё стало окончательно ясно и всё встало на свои места.</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-15T15:28:41Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87385#p87385</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87376#p87376" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-15T14:06:11Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87376#p87376</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87370#p87370" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-15T12:18:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87370#p87370</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87336#p87336" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-14T15:57:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87336#p87336</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87330#p87330" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-14T04:26:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87330#p87330</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87325#p87325" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-13T17:50:51Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87325#p87325</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87323#p87323" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-13T16:55:33Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87323#p87323</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87320#p87320" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>вот этот же самый код, но вставленный в мой скрипт - почему-то после выполнения процитированного if снова возвращается к нему же</p></blockquote></div><p>Это я не совсем понял. Но явная ошибка — помещать обработку события в ту же функцию, что его отлавливает. Обработка занимает время, в которое могут происходить новые события, и тут могут возникать сбои. В функции не должно быть ничего, кроме отлова события, а обработку лучше всего повесить на таймер.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-13T15:53:51Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87320#p87320</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87315#p87315" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-13T15:37:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87315#p87315</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87140#p87140" />
			<content type="html"><![CDATA[<p>Чего-то странно я как-то тестировал. Похоже, я outputdebug ставил после этого условия, а не внутри него.<br />Всё в порядке, разобрался, спасибо.</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-10T15:11:12Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87140#p87140</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87138#p87138" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-10T11:58:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87138#p87138</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87137#p87137" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong>, а как вы определили, что один? не по messagebox&#039;у ли? если так, то это ни о чём не говорит, т.к. messagebox паузит выполнение скрипта.<br />Я выполнял &quot;outputdebug, a drive (dis)appeared!&quot; и смотрел в debugview сколько же я таких сообщений получу; оказалось, что получаю их много.</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-10T11:51:30Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87137#p87137</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87136#p87136" />
			<content type="html"><![CDATA[<p>Что вы называете onmessag&#039;ами? У меня при подключении флешки функция <em>WM_DEVICECHANGE()</em> сигнализирует один раз, при отключении — тоже один.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-10-10T11:22:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87136#p87136</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87067#p87067" />
			<content type="html"><![CDATA[<p>А почему при однократном подключении+отключении флешки генерируется так много одинаковых onmessage&#039;ей? 8 при отключении и 16-18 при подключении.<br />Можно ли как-то (возможно, по каким-то смежным событиям) добиться того, чтобы однократное подключение и однократное отключение генерировали только 1 событие?</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2014-10-07T06:38:46Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87067#p87067</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Можно ли узнать о подкл./откл. дисках с помощью OnMessage()?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=83514#p83514" />
			<content type="html"><![CDATA[<p>Да уж, <a href="http://www.youtube.com/watch?v=FutWFlnAH00">просто</a></p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2014-05-30T06:35:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=83514#p83514</id>
		</entry>
</feed>
