<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Работа с потоками autohotkey.dll]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=13184</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=13184&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Работа с потоками autohotkey.dll».]]></description>
		<lastBuildDate>Thu, 01 Jun 2023 23:02:45 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158419#p158419</link>
			<description><![CDATA[<p>Если TerminateThread() так сделать<br /></p><div class="codebox"><pre><code>TerminateThread(MemLib) {
   DllCall(MemLib.GetProcAddress(&quot;ahkterminate&quot;)), MemLib.Free()
}</code></pre></div><p>то тоже нормально работает, но только для одной ветки, для большего количества начинает ошибки из _Struct.ahk выдавать. Скорее всего, баги в библиотеках. Я как-то пытался связаться с HotKeyIt по поводу другого бага, но безуспешно, и бросил использовать эту конструкцию в реальных проектах.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 01 Jun 2023 23:02:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158419#p158419</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158418#p158418</link>
			<description><![CDATA[<p>Да, я про это и говорю.<br />При этом такой пример работает:<br /></p><div class="codebox"><pre><code>DllCall(MemLib.GetProcAddress(&quot;ahktextdll&quot;),&quot;Str&quot;,&quot;~lbutton up::msgbox&quot;,&quot;Str&quot;,&quot;&quot;,&quot;Str&quot;,&quot;&quot;) ; start first AutoHotkey.dll thread
Sleep 1000
MsgBox,0, AutoHotkey.dll started, press OK to terminate.
DllCall(MemLib.GetProcAddress(&quot;ahkterminate&quot;)),     	MemLib.Free()
MsgBox AutoHotkey.dll threads terminated and memory freed</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Thu, 01 Jun 2023 22:40:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158418#p158418</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158417#p158417</link>
			<description><![CDATA[<p>Там первый параметр обязательный, нужно RunNewThreadWithAutoHotkeyDll(&quot;&quot;). У меня завершение ветки происходит, но, правда, при этом основная ветка тоже крашится. Может, от версии зависит, сейчас проверил на AHK_H\v1.1.32.00.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 01 Jun 2023 22:38:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158417#p158417</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158416#p158416</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, у кода из 100 поста не работает terminate.<br /></p><div class="codebox"><pre><code>RunNewThreadWithAutoHotkeyDll(&quot;#persistent&quot;, A_IsCompiled ? &quot;&quot; : A_PtrSize = 8 ? ahkDll64 : ahkDll32)
sleep 1000
RunNewThreadWithAutoHotkeyDll()</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Thu, 01 Jun 2023 21:03:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158416#p158416</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=145172#p145172</link>
			<description><![CDATA[<p>На сегодняшний день в этом плане ничего не изменилось.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 21 Jan 2021 18:08:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=145172#p145172</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=145171#p145171</link>
			<description><![CDATA[<p>Работы с потоками. Вначале описывается, как с помощью autohotkey.dll настроить многопоточность.</p>]]></description>
			<author><![CDATA[null@example.com (DD)]]></author>
			<pubDate>Thu, 21 Jan 2021 18:01:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=145171#p145171</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=145170#p145170</link>
			<description><![CDATA[<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>Thu, 21 Jan 2021 17:58:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=145170#p145170</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=145169#p145169</link>
			<description><![CDATA[<p>Не считая возможности обмениваться сообщениями между скриптами — на сегодня можно обходиться без autohotkey.dll для описанного функционала?</p>]]></description>
			<author><![CDATA[null@example.com (DD)]]></author>
			<pubDate>Thu, 21 Jan 2021 17:49:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=145169#p145169</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=138600#p138600</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, благодарю, обновил.</p>]]></description>
			<author><![CDATA[null@example.com (KusochekDobra)]]></author>
			<pubDate>Thu, 26 Mar 2020 21:20:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=138600#p138600</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=138599#p138599</link>
			<description><![CDATA[<p><strong>KusochekDobra</strong>, приветствую!<br />Нужно иметь в виду, что подбный ExecScript() не поддерживает юникод. Сравните:<br /></p><div class="codebox"><pre><code>ExecScript(&quot;MsgBox,, ExecScript, ♪&quot;)
DynaRun(&quot;MsgBox,, DynaRun, ♪&quot;)

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.ProcessID
}

DynaRun(tempScript, ahkPath := &quot;&quot;, pipeName := &quot;&quot;, args*)
{
   static params := [ &quot;UInt&quot;, PIPE_ACCESS_OUTBOUND     := 0x2, &quot;UInt&quot;, 0
                    , &quot;UInt&quot;, PIPE_UNLIMITED_INSTANCES := 255, &quot;UInt&quot;, 0
                    , &quot;UInt&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot; ]
        , BOM := Chr(0xFEFF)

   (ahkPath = &quot;&quot; &amp;&amp; ahkPath := A_AhkPath)
   (pipeName = &quot;&quot; &amp;&amp; pipeName := &quot;AHK_&quot; . A_TickCount)
   
   Loop 1 {
      for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
         %v% := DllCall(&quot;CreateNamedPipe&quot;, Str, &quot;\\.\pipe\&quot; . pipeName, params*)
      if ( (pipe = -1 || pipeGA = -1) &amp;&amp; error := &quot;Can&#039;t create pipe &quot;&quot;&quot; . pipeName . &quot;&quot;&quot;`nLastError: &quot; . A_LastError )
         break
      sCmd := ahkPath . &quot; &quot;&quot;\\.\pipe\&quot; . pipeName . &quot;&quot;&quot;&quot;
      for k, v in args
         sCmd .= &quot; &quot;&quot;&quot; . v . &quot;&quot;&quot;&quot;
      Run, % sCmd,, UseErrorLevel HIDE, PID
      if (ErrorLevel &amp;&amp; error := &quot;Can&#039;t open file:`n &quot;&quot;\\.\pipe\&quot; . pipeName . &quot;&quot;&quot;&quot;)
         break
      for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
         DllCall(&quot;ConnectNamedPipe&quot;, Ptr, %v%, Ptr, 0)
      tempScript := BOM . tempScript
      tempScriptSize := ( StrLen(tempScript) + 1 ) &lt;&lt; !!A_IsUnicode
      if !DllCall(&quot;WriteFile&quot;, Ptr, pipe, Str, tempScript, UInt, tempScriptSize, UIntP, 0, Ptr, 0)
         error := &quot;WriteFile failed, LastError: &quot; . A_LastError
   }
   for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
      ( %v% != -1 &amp;&amp; DllCall(&quot;CloseHandle&quot;, Ptr, %v%) )
   if error
      throw Exception(error)
   Return PID
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 26 Mar 2020 21:02:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=138599#p138599</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=138597#p138597</link>
			<description><![CDATA[<p>Всем добра!</p><p>По мотивам <a href="http://forum.script-coding.com/viewtopic.php?pid=126433#p126433">интересного материала</a>.<br />Простая обёртка классом, для большего удобства запуска параллельных задач. Упрощает навигацию данных коммутируемого объекта и заботится о жизненном цикле подключаемых сценариев:<br /></p><div class="codebox"><pre><code>
Class ScriptToProcess
{
	__New() {
		this.counter := 0
		this.GUID    := CreateGUID()
		this.SERVER  := {GLOBAL_STORAGE: []}
		ObjRegisterActive(this.SERVER, this.GUID)
	}
	
	; ============================================================================================================
	;	Добавляет и запускает скрипт.
	;	script		- ( string ) текст сценария или путь до файла со сценарием, который будет запущен.
	;	pseudonym	- ( string ) псевдоним, через который будет доступен коммутируемый объект. По умолчанию
	;					использует внутренний счётчик. Если псевдоним уже используется, к нему
	;					конкатенируется текущее значение внутреннего счётчика, приращивающегося
	;					с каждым добавленным сценарием.
	;	persist		- ( bool ) добавляет &quot;#Persistent&quot;, заставляя сценарий быть постоянно активным.
	;					По умолчанию &quot;false&quot;.
	;	tray_icon	- ( int[0, 1]/string ) выключает или задаёт отображение иконки в трее.
	;					Допустимые значения:
	;						0 - отключить показ иконки.
	;						1 - включить показ иконки.
	;						( string ) - содержит путь к файлу, или shell32.dll с номером.
	;							(например - &quot;shell32.dll, 110&quot;). По умолчанию 1.
	;	libs		- ( Array(string) ) массив строк с путями к подключаемым модулям.
	;	callbacks	- ( Array(Func()) ) последний аргумент принимает любое количество коллбэков, которые
	;					затем можно вызывать в том же порядке, используя глобальную константу &quot;SELF&quot;.
	;						(например, первый коллбэк - SELF.callbacks[1].Call( data )).
	;	
	;	В добавленные к выполнению таким образом сценарии, ВСЕГДА предустанавливаются ряд глобальных
	;		констант, а так же функция завершения. А именно:
	;	
	;	PSEUDONYM		- ( string ) строка, представляющая псевдоним конкретно этого контекста.
	;	SERVER			- ( ComObject ) глобальный коммутируемый объект, через который доступны все
	;						добавленные сценарии.
	;	GLOBAL_STORAGE	- ( ComObject ) глобальное хранилище, доступное каждому добавленному сценарию.
	;	SELF			- ( ComObject ) часть глобального коммутируемого объекта, относящаяся
	;						непосредственно к данным, оперируемым текущим контекстом. Через неё доступны
	;						поля:
	;							done		- ( Func() ) содержащее ссылку на коллбэк, завершающий работу
	;											текущего контекста.
	;							data		- ( Array() ) массив. Размещайте здесь данные, предназначенные
	;											только для текущего контекста.
	;							callbacks	- ( Array(Func()) ) массив коллбэков. Функции вызывающего
	;											сценария, вызываемые из текущего контекста.
	;	_Done_			- ( Func() ) функция, содержащая единственную инструкцию - &quot;ExitApp&quot;.
	; ============================================================================================================
	Add(script, pseudonym := &quot;&quot;, persist := false, tray_icon := 1, libs := &quot;&quot;, callbacks*) {
		
		if (FileExist(script))
			FileRead, script,% script
		
		this.counter += 1
		if (!pseudonym)
			pseudonym := this.counter
		else if (this.SERVER.HasKey( pseudonym ))
			pseudonym .= this.counter
		this.SERVER[ pseudonym ] := {done: &quot;&quot;, data: [], callbacks: callbacks}
		
		add_content := &quot;&quot;
		add_content .= &quot;#NoEnv`r`n&quot;
		add_content .= persist ? &quot;#Persistent`r`n&quot; : &quot;&quot;
		add_content .= tray_icon == 1 ? &quot;&quot; : &quot;Menu, Tray, &quot; . (tray_icon == 0 ? &quot;NoIcon&quot; : &quot;Icon, &quot; . tray_icon) . &quot;`r`n&quot;
		add_content .= &quot;Global PSEUDONYM := &quot;&quot;&quot; . pseudonym . &quot;&quot;&quot;`r`n&quot;
		add_content .= &quot;Global SERVER := ComObjActive(&quot;&quot;&quot; . this.GUID . &quot;&quot;&quot;)`r`n&quot;
		add_content .= &quot;Global GLOBAL_STORAGE := SERVER[ &quot;&quot;GLOBAL_STORAGE&quot;&quot; ]`r`n&quot;
		add_content .= &quot;Global SELF := SERVER[ PSEUDONYM ]`r`n&quot;
		add_content .= &quot;SELF.done := Func(&quot;&quot;_Done_&quot;&quot;)`r`n&quot;
		add_content .= &quot;_Done_() {`r`n	ExitApp`r`n}`r`n&quot;
		
		lib_content := &quot;`r`n&quot;
		For i, lib in libs {
			if (FileExist(lib))
				FileRead, lib,% lib
			lib_content .= lib . &quot;`r`n&quot;
		}
		
		script := add_content . script . lib_content
		
		DynaRun(script)
	}
	
	; ============================================================================================================
	;	Удаляет и завершает выполнение добавленного сценария.
	;	pseudonym	- псевдоним сценария, выполнение которого необходимо завершить.
	; ============================================================================================================
	Remove(pseudonym) {
		if (pseudonym != &quot;GLOBAL_STORAGE&quot; &amp;&amp; this.SERVER.HasKey( pseudonym )) {
			Try
				this.SERVER[ pseudonym ].done.Call()
			this.SERVER.Delete( pseudonym )
		}
	}
	
	; ============================================================================================================
	;	Завершает все активные сценарии. Вызывается автоматически при удалении экземпляра
	;		этого класса.
	; ============================================================================================================
	RemoveAll() {
		tasks := []
		For key in this.SERVER
			tasks.Push( key )
		For i, task in tasks
			this.Remove( task )
	}
	
	__Get(name) {
		return this.SERVER[ name ]
	}
	
	__Delete() {
		this.RemoveAll()
		ObjRegisterActive(this.SERVER, &quot;&quot;)
	}
}

ObjRegisterActive(Object, CLSID, Flags := 0) {
	static cookieJar := {}
	if !CLSID {
		if (( cookie := cookieJar.Delete(Object) ) != &quot;&quot;)
			DllCall(&quot;oleaut32\RevokeActiveObject&quot;, UInt, cookie, Ptr, 0)
		return
	}
	if cookieJar[Object]
		throw Exception(&quot;Object is already registered&quot;, -1)
	VarSetCapacity(_clsid, 16, 0)
	if (hr := DllCall(&quot;ole32\CLSIDFromString&quot;, WStr, CLSID, Ptr, &amp;_clsid)) &lt; 0
		throw Exception(&quot;Invalid CLSID&quot;, -1, CLSID)
	hr := DllCall(&quot;oleaut32\RegisterActiveObject&quot;, Ptr, &amp;Object, Ptr, &amp;_clsid, UInt, Flags, UIntP, cookie, UInt)
	if hr &lt; 0
		throw Exception(format(&quot;Error 0x{:x}&quot;, hr), -1)
	cookieJar[Object] := cookie
}

CreateGUID()
{
	VarSetCapacity(pguid, 16, 0)
	if !DllCall(&quot;ole32.dll\CoCreateGuid&quot;, Ptr, &amp;pguid)  {
		size := VarSetCapacity(sguid, (38 &lt;&lt; !!A_IsUnicode) + 1, 0)
		if DllCall(&quot;ole32.dll\StringFromGUID2&quot;, Ptr, &amp;pguid, Ptr, &amp;sguid, UInt, size)
			return StrGet(&amp;sguid)
	}
}

DynaRun(tempScript, ahkPath := &quot;&quot;, pipeName := &quot;&quot;, args*)
{
	static params := [ &quot;UInt&quot;, PIPE_ACCESS_OUTBOUND     := 0x2, &quot;UInt&quot;, 0
						, &quot;UInt&quot;, PIPE_UNLIMITED_INSTANCES := 255, &quot;UInt&quot;, 0
						, &quot;UInt&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot; ]
		, BOM := Chr(0xFEFF)

	(ahkPath = &quot;&quot; &amp;&amp; ahkPath := A_AhkPath)
	(pipeName = &quot;&quot; &amp;&amp; pipeName := &quot;AHK_&quot; . A_TickCount)
	
	Loop 1 {
		for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
			%v% := DllCall(&quot;CreateNamedPipe&quot;, Str, &quot;\\.\pipe\&quot; . pipeName, params*)
		if ( (pipe = -1 || pipeGA = -1) &amp;&amp; error := &quot;Can&#039;t create pipe &quot;&quot;&quot; . pipeName . &quot;&quot;&quot;`nLastError: &quot; . A_LastError )
			break
		sCmd := ahkPath . &quot; &quot;&quot;\\.\pipe\&quot; . pipeName . &quot;&quot;&quot;&quot;
		for k, v in args
			sCmd .= &quot; &quot;&quot;&quot; . v . &quot;&quot;&quot;&quot;
		Run, % sCmd,, UseErrorLevel HIDE, PID
		if (ErrorLevel &amp;&amp; error := &quot;Can&#039;t open file:`n &quot;&quot;\\.\pipe\&quot; . pipeName . &quot;&quot;&quot;&quot;)
			break
		for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
			DllCall(&quot;ConnectNamedPipe&quot;, Ptr, %v%, Ptr, 0)
		tempScript := BOM . tempScript
		tempScriptSize := ( StrLen(tempScript) + 1 ) &lt;&lt; !!A_IsUnicode
		if !DllCall(&quot;WriteFile&quot;, Ptr, pipe, Str, tempScript, UInt, tempScriptSize, UIntP, 0, Ptr, 0)
			error := &quot;WriteFile failed, LastError: &quot; . A_LastError
	}
	for k, v in [&quot;pipeGA&quot;, &quot;pipe&quot;]
		( %v% != -1 &amp;&amp; DllCall(&quot;CloseHandle&quot;, Ptr, %v%) )
	if error
		throw Exception(error)
	Return PID
}
</code></pre></div><div class="codebox"><pre><code>
#NoEnv
#SingleInstance, Force

SetWorkingDir,% A_ScriptDir
ListLines, Off
SetBatchLines, -1
OnExit, BeforeExit
SplitPath,% A_ScriptFullPath,,,, fNameNoExt

; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt;
	#Include ScriptToProcess.ahk
; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt;
	ww := 400, hh := 100
; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt;
	INI := &quot;Config.ini&quot;
	if (!FileExist(INI))
		FileAppend,,% INI,UTF-16
		
	IniRead, x_pos,% INI, Main, x_pos,% A_ScreenWidth // 2 - ww // 2
	IniRead, y_pos,% INI, Main, y_pos,% A_ScreenHeight // 2 - hh // 2
; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt;

	Gui, 1: +HWND_main_h
	Gui, 1: Margin, 10, 10

	Gui, 1: Add, Edit, xm y+5 w%ww% r5 v_myEdit
	Gui, 1: Add, Button, xm y+5 w%ww% gDoSomething,Кнопка

	Gui, 1: Show,x%x_pos% y%y_pos%,% fNameNoExt

; &gt;&gt;--++--&lt;&lt; script &gt;&gt;--++--&lt;&lt;
task =
(%
data := SELF.data

interval := -1
SetTimer, CheckMyData,% interval

Return

CheckMyData:
	if (data.Count()) {
		; MsgBox,% data.RemoveAt(1)
		SELF.callbacks[1].Call(Format(&quot;&#039;{}&#039; from CallBack name =&gt; &#039;{}&#039;&quot;, data.RemoveAt(1), SELF.callbacks[1].name ))
		SetTimer, CheckMyData,% interval := -1
	} else
		SetTimer, CheckMyData,% interval &gt; -250 ? (interval -= 1) : interval
Return
)
; &gt;&gt;--++--&lt;&lt; script &gt;&gt;--++--&lt;&lt;
include_libs := []

tasks := new ScriptToProcess()
; tasks.Add(&quot;test.ahk&quot;, &quot;helper&quot;, 1, &quot;shell32.dll, 110&quot;, include_libs, Func(&quot;CallBackFunction&quot;))
tasks.Add(task, &quot;helper&quot;, 1, &quot;shell32.dll, 110&quot;, include_libs, Func(&quot;CallBackFunction&quot;) )
helper_data := tasks[ &quot;helper&quot; ].data

Return

CallBackFunction(data) {
	MsgBox,% data
}
	
DoSomething:
	Gui, 1: Submit, NoHide
	helper_data.Push(_myEdit)
Return

BeforeExit:
	
	WinGetPos, xx, yy, , , ahk_id%_main_h%
	Gui, 1: Submit
	
	if (xx != x_pos &amp;&amp; xx &gt; 0)
		IniWrite,% xx,% INI, Main, x_pos
	if (yy != y_pos &amp;&amp; yy &gt; 0)
		IniWrite,% yy,% INI, Main, y_pos
	
	if (A_ExitReason) {
		ExitApp
	}
return

GuiClose:
	ExitApp
</code></pre></div><p>В примере, основной сценарий помещает некоторые данные из поля <em>Edit</em> в <em>data</em> коммутируемого объекта, а подключаемый, ожидает эти данные, чтобы передать их обратно основному сценарию в коллбэке.</p><p><strong>30.03.2020 UPD:</strong> Теперь позволяет подключать модули(#Include), полученные в виде массива строк с путями к ним, из параметра &quot;libs&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (KusochekDobra)]]></author>
			<pubDate>Thu, 26 Mar 2020 20:45:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=138597#p138597</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=127223#p127223</link>
			<description><![CDATA[<p><strong>powercat</strong>, ничего не могу сказать, пока не увижу ваш код, как вы считываете ресурс, и как используете.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 21 Jul 2018 00:08:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=127223#p127223</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=127222#p127222</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Получилось добавить ресурс, но BinRun() выдает ошибку e_magic. Видимо FileInstall и BinRun как-то зависят друг от друга. Отдельно не работает.. Как-то сложно все с этим ahk_h.</p>]]></description>
			<author><![CDATA[null@example.com (powercat)]]></author>
			<pubDate>Fri, 20 Jul 2018 23:14:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=127222#p127222</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=127138#p127138</link>
			<description><![CDATA[<div class="quotebox"><cite>powercat пишет:</cite><blockquote><p>Есть альтернативные способы &quot;вшитья&quot; файла в ресурсы</p></blockquote></div><p>Ну да, есть обычный способ через winapi: <a href="https://docs.microsoft.com/en-us/windows/desktop/menurc/using-resources#updating-resources	">Updating Resources</a>.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 18 Jul 2018 19:17:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=127138#p127138</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Работа с потоками autohotkey.dll]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=127134#p127134</link>
			<description><![CDATA[<p>Раз уж тут тема про BinRun() зашла, может подскажет кто-то.<br />При компиляции данного скрипта, в ресурсы будет вшит file.exe, а называться ресурс будет - &quot;C:\Users\user\Desktop\file.exe&quot;. Так вот этот ресурс нельзя переименовывать, иначе вылетает ERROR e_magic not found. Есть альтернативные способы &quot;вшитья&quot; файла в ресурсы, кроме FileInstall, с последующим успешным запуском? <br /></p><div class="codebox"><pre><code>
If 0
	FileInstall, C:\Users\user\Desktop\file.exe,-
BinRun(&quot;C:\Users\user\Desktop\file.exe&quot;)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (powercat)]]></author>
			<pubDate>Wed, 18 Jul 2018 15:36:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=127134#p127134</guid>
		</item>
	</channel>
</rss>
