<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Асинхронный запуск скриптов]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=10765</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10765&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Асинхронный запуск скриптов».]]></description>
		<lastBuildDate>Mon, 20 Feb 2017 11:17:35 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112919#p112919</link>
			<description><![CDATA[<p>Здесь «two» — это не ограничение, имеется в виду, что одно обменивается сообщениями с другим.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 20 Feb 2017 11:17:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112919#p112919</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112861#p112861</link>
			<description><![CDATA[<p>Дочерние скрипты у меня уже имеются.<br />Вопрос в том, что если я впишу в посылаемый скрипт код с 91 поста - не будет ли в этом ошибки?<br />Потому как msdn пишет:<br /></p><div class="quotebox"><blockquote><p>The RegisterWindowMessage function is typically used to register messages for communicating <strong>between two</strong> cooperating applications.</p></blockquote></div><p><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947(v=vs.85).aspx">https://msdn.microsoft.com/en-us/librar … s.85).aspx</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sun, 19 Feb 2017 16:50:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112861#p112861</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112848#p112848</link>
			<description><![CDATA[<div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>если я хочу сделать несколько принимающих, достаточно ли будет их склонировать под разными именами</p></blockquote></div><p>Вообще не нужно создавать отдельные файлы, всё можно сгенерировать родительским файлом. Вот пример:<br /></p><div class="codebox"><pre><code>param = %1%

if (param != &quot;&quot;)
   Menu, Tray, Icon, %A_AhkPath%, 2

#SingleInstance, Off
DetectHiddenWindows, On
OnMessage(WM_INFO := DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;WM_INFO&quot;), Func(&quot;WM_INFO_RECEIVER&quot;).Bind(param))

if (param = &quot;&quot;) {
   children := []
   Loop 3  {
      Run, &quot;%A_AhkPath%&quot; &quot;%A_ScriptFullPath%&quot; &quot;%A_Index%&quot;,,, PID
      children.Push(PID)
      while !WinExist(&quot;ahk_pid&quot; PID)
         Sleep, 10
   }
   for k, v in children  {
      task%A_Index% := &quot;Посчитать &#039;3**&quot; A_Index &quot;&#039;&quot;
      SendMyMessage(WM_INFO, v, &amp;task%A_Index%, StrLen(task%A_Index%))
   }
   OnExit(Func(&quot;CloseChildren&quot;).Bind(children))
}      

SendMyMessage(msg, PID, pStr, len)  {
   if A_IsUnicode
      len *= 2
   MyPID := DllCall(&quot;GetCurrentProcessId&quot;)
   wp := MyPID | (len &lt;&lt; 16)
   lp := pStr
   SendMessage, msg, wp, lp,, ahk_pid %PID%
}

WM_INFO_RECEIVER(param, wp, lp, msg)  {
   Critical
   static reply, text
   PID := wp &amp; 0xFFFF
   strSize := wp &gt;&gt; 16
   strPtr := lp
   str := ReadStringInAnotherProcess(PID, strPtr, strSize)
   
   if !param
      MsgBox, % str
   else  {
      RegExMatch(str, &quot;&#039;(.*)&#039;&quot;, match)
      reply := &quot;Ответ от скрипта &quot; . param . &quot;:`n&quot; . match1 . &quot; = &quot; . ExecScript(&quot;FileAppend, % &quot; match1 &quot;, *&quot;)
      SendMyMessage(msg, PID, &amp;reply, StrLen(reply))
   }
}
      
ReadStringInAnotherProcess(PID, addr, size)  {
   static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
   
   hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr)
   VarSetCapacity(buff, size, 0)
   DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, addr, Ptr, &amp;buff, Ptr, size, Int, 0)
   DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
   Return StrGet(&amp;buff)
}

CloseChildren(pids)  {
   for k, v in pids
      WinClose, ahk_pid %v%
}

ExecScript(Script)  {
   shell := ComObjCreate(&quot;WScript.Shell&quot;)
   exec := shell.Exec(&quot;AutoHotkey.exe /ErrorStdOut *&quot;)
   exec.StdIn.Write(script)
   exec.StdIn.Close()
   return exec.StdOut.ReadAll()
}</code></pre></div><p>Здесь родительский скрипт сначала создаёт три дочерних из своего же файла, потом рассылает им строки, и получает ответы.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 19 Feb 2017 13:22:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112848#p112848</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112732#p112732</link>
			<description><![CDATA[<p>А, да, точно. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />&nbsp; Не имеет смысла, раз там есть DetectHiddenWindows, on. Завтра посмотрю, сейчас с телефона.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 17 Feb 2017 17:35:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112732#p112732</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112731#p112731</link>
			<description><![CDATA[<p>Потому что ты так написал в 90 посте.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Fri, 17 Feb 2017 17:27:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112731#p112731</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112725#p112725</link>
			<description><![CDATA[<p>Не совсем понял эту идею:<br /></p><div class="codebox"><pre><code>WinGet, ParentHWND, id, check.ahk ahk_class AutoHotkey
DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND, UInt, WM_INFO, Ptr, wp, Ptr, lp)</code></pre></div><p>Зачем здесь PostMessage через DllCall?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 17 Feb 2017 16:16:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112725#p112725</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112690#p112690</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, а если я хочу сделать несколько принимающих, достаточно ли будет их склонировать под разными именами, а отправляющему вписать:<br /></p><div class="codebox"><pre><code>WinGet, ParentHWND, id, check.ahk ahk_class AutoHotkey
DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND, UInt, WM_INFO, Ptr, wp, Ptr, lp)
WinGet, ParentHWND1, id, check1.ahk ahk_class AutoHotkey
DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND1, UInt, WM_INFO, Ptr, wp, Ptr, lp)
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Fri, 17 Feb 2017 12:11:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112690#p112690</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104201#p104201</link>
			<description><![CDATA[<p>Вот так без номеров:<br /></p><div class="codebox"><pre><code>SetTitleMatchMode, 2
DetectHiddenWindows on
WinGet, ParentHWND, id, check.ahk ahk_class AutoHotkey
MyPID := DllCall(&quot;GetCurrentProcessId&quot;)
WM_INFO := DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;WM_INFO&quot;)
	
fileread, text, 1.txt
BuffLen := StrLen(text) * (A_IsUnicode ? 2 : 1)
VarSetCapacity(Info, A_PtrSize*2, 0)
NumPut(&amp;text, NumPut(BuffLen, Info))

wp := MyPID, lp := &amp;Info
DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND, UInt, WM_INFO, Ptr, wp, Ptr, lp)
return</code></pre></div><div class="codebox"><pre><code>#Persistent
OnMessage(DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;WM_INFO&quot;), &quot;WM_INFO_RECEIVER&quot;)

WM_INFO_RECEIVER(wp, lp)
{
	static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_READ := 0x10
	Critical
	PID := wp
	pInfo := lp

	if hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)  {
		VarSetCapacity(LocalBuff, A_PtrSize * 2, 0)
		if DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, pInfo, Ptr, &amp;LocalBuff, Ptr, A_PtrSize * 2, Ptr, 0)  {
			TextSize := NumGet(LocalBuff), pText := NumGet(&amp;LocalBuff + A_PtrSize)
			VarSetCapacity(LocalBuff, TextSize, 0)
			res := DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, pText, Ptr, &amp;LocalBuff, Ptr, TextSize, Ptr, 0)
		}
		DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
	}
	if !res  {
		MsgBox, Ошибка при чтении данных
		Return
	}
	msgbox % clipboard := StrGet(&amp;LocalBuff)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 25 May 2016 12:53:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104201#p104201</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104189#p104189</link>
			<description><![CDATA[<p>Отправляющие:<br /></p><div class="codebox"><pre><code>SetTitleMatchMode, 2
DetectHiddenWindows on
WinGet, ParentHWND, id, check.ahk ahk_class AutoHotkey
MyNumber := 1  ; у каждого отправляющего скрипта должен быть свой номер, от 1 до 15
MyPID := DllCall(&quot;GetCurrentProcessId&quot;)
WM_INFO := DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;WM_INFO&quot;)
if !PidSent
	DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND, UInt, WM_INFO, Ptr, (MyNumber &lt;&lt; 16)|MyPID, Ptr, 0), PidSent := 1
	
fileread, text, 1.txt
BuffLen := StrLen(Text) * (A_IsUnicode ? 2 : 1)
if (BuffLen &gt; 0xFFFFFFF)  {
	MsgBox, Текст слишком длинный`, не будет отправлен!
	Return
}
wp := (MyNumber &lt;&lt; 28) | BuffLen
lp := &amp;Text
DllCall(&quot;PostMessage&quot;, Ptr, ParentHWND, UInt, WM_INFO, Ptr, wp, Ptr, lp)
return</code></pre></div><p>Принимающий:<br /></p><div class="codebox"><pre><code>#Persistent
OnMessage(DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;WM_INFO&quot;), &quot;WM_INFO_RECEIVER&quot;)

WM_INFO_RECEIVER(wp, lp)
{
   static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_READ := 0x10, PidArray := []
   Critical
   if !lp  {
		PidArray[wp &gt;&gt; 16] := wp &amp; 0xFFFF
		Return
	}
   Pointer := lp
   BuffSize := wp &amp; 0xFFFFFFF
	PID := PidArray[wp &gt;&gt; 28]
   
   VarSetCapacity(LocalBuff, BuffSize, 0)
   if !hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)
      Return
   
   res := DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, Pointer, Ptr, &amp;LocalBuff, Ptr, BuffSize, Ptr, 0)
   DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
   if !res
      Return

   msgbox % clipboard := StrGet(&amp;LocalBuff)
}</code></pre></div><p>Сначала запускать принимающий.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 24 May 2016 22:42:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104189#p104189</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104188#p104188</link>
			<description><![CDATA[<p>Становится яснее, а напиши, как это должно выглядеть с уникальным номером каждого из скриптов.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 24 May 2016 22:15:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104188#p104188</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104187#p104187</link>
			<description><![CDATA[<p>А как ты строку хочешь передать в параметре сообщения? Там только цифры можно передавать. В 32-битном AHK в каждом параметре по 4 байта, т. е. от 0 до 0xFFFFFFFF. В одном из них у нас передаётся указатель на текст. Для чтения текста нам нужно знать PID процесса, в адресном пространстве которого этот указатель находится. Также нам нужно знать длину текста, чтобы зарезервировать буфер под него.</p><p>Можно, конечно, длину не посылать, и резервировать буфер максимально возможной длины. Этот вариант не очень экономичный, но реализуемый. Тогда нужно знать эту максимальную длину. Но, по-моему, проще прописывать в каждом скрипте уникальный номер, и отправлять его вместе с длиной. Если посылающих скриптов не больше пятнадцати, каждый номер займет всего 4 бита в параметре сообщения, остального места хватит, чтобы впихнуть длину вплоть до 268435455/2 знаков.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 24 May 2016 21:32:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104187#p104187</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104186#p104186</link>
			<description><![CDATA[<p>Не знаю. Ну а разве есть разница между передачей порядкового номера прописанного в скрипте или его пути?</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 24 May 2016 20:57:23 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104186#p104186</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104184#p104184</link>
			<description><![CDATA[<p>А как потом в сообщениях узнавать, от какого скрипта они приходят?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 24 May 2016 20:46:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104184#p104184</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104183#p104183</link>
			<description><![CDATA[<p>Так может тогда вначале передать PID и A_ScriptHwnd либо A_ScriptFullPath для инициализации, чтоб не вписывать в каждый скрипт порядковый номер?</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 24 May 2016 20:11:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104183#p104183</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Асинхронный запуск скриптов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=104182#p104182</link>
			<description><![CDATA[<p>Да, но PIDы всё равно нужно будет сначала передать, а потом их по номерам идентифицировать.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 24 May 2016 20:02:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=104182#p104182</guid>
		</item>
	</channel>
</rss>
