<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS,HTA: Скрипты вне окна и внутри его]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=13235</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=13235&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS,HTA: Скрипты вне окна и внутри его».]]></description>
		<lastBuildDate>Mon, 27 Nov 2017 17:57:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121706#p121706</link>
			<description><![CDATA[<p>Большое спасибо.<br />Теперь у меня ещё больше материала для изучения.<br />Я, в общем-то, чайник, поэтому использую простые методы и те, которые нахожу здесь, например.<br />То, ради чего всё это затевалось, уже почти работает в форме</p><div class="codebox"><pre><code>...
Set Win.Main=Me
...
Win.SetTimeout &quot;Main.Control &quot;,5000,&quot;VBScript&quot;
...</code></pre></div><p>Но в любом случае изучу приведённые примеры.<br />Ещё раз спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (fy73)]]></author>
			<pubDate>Mon, 27 Nov 2017 17:57:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121706#p121706</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121704#p121704</link>
			<description><![CDATA[<p>Приветствую, господа. Почитал тему и задумался. Как-то всё сумбурно. Непонятно что для чего и куда (ну по крайней мере мне). </p><p>Решил начать по пунктам с тем с чем не согласен<br /></p><div class="quotebox"><cite>fy73 пишет:</cite><blockquote><p>Но тут появляется новая сложность: если метод SetTimeout доступен только в &quot;оконном VBS&quot;, то объект WScript в нём никак невозможен.</p></blockquote></div><p>Ну почему же недоступен ? Если очень нужно, то доступен.</p><div class="codebox"><pre><code>
Option Explicit

Dim objUDF
Dim intIntervalID
Dim intTimeoutID
Set objUDF = new clsUDF

RunInConsoleMode()

intIntervalID = objUDF.SetInterval(GetRef(&quot;Interval_Test&quot;), 1000)

intTimeoutID = objUDF.SetTimeout(GetRef(&quot;Timeout_Test&quot;), 5000)

Sub Interval_Test()
	WScript.Echo &quot;Sub Interval_Test called. &quot; &amp; Time
End Sub

Sub Timeout_Test()
	objUDF.ClearInterval intIntervalID
	objUDF.ClearTimeout intTimeoutID
	WScript.Echo &quot;Timeout reached !&quot;
End Sub

WScript.Sleep 6000

WScript.Echo &quot;Complete.... Please, press &lt;ENTER&gt;&quot;

WScript.StdIn.ReadLine

Class clsUDF
	Private document,_
			window
	
	Private Sub Class_Initialize()
		Set document = CreateObject(&quot;htmlfile&quot;)
		Set window = document.parentWindow
	End Sub
	
	Public Function SetTimeout(object, timeout)
		SetTimeout = window.setTimeout(object, timeout)
	End Function

	Public Function SetInterval(object, timeout)
		SetInterval = window.setInterval(object, timeout)
	End Function

	Public Sub ClearInterval(intervalId)
		window.clearInterval intervalId
	End Sub
	
	Public Sub ClearTimeout(timeoutId)
		window.clearTimeout timeoutId
	End Sub
	
End Class

Sub RunInConsoleMode()
	If InStr(1,WScript.FullName,&quot;cscript&quot;,1) &lt;= 0 Then 
		CreateObject(&quot;WScript.Shell&quot;).Run(&quot;cscript /nologo &quot;&quot;&quot; &amp; WScript.ScriptFullName &amp; &quot;&quot;&quot;&quot;)
		WScript.Quit
	End If
End Sub
</code></pre></div><div class="quotebox"><cite>fy73 пишет:</cite><blockquote><p>К сожалению, GetRef не даёт передать аргументы, что не очень удобно.</p></blockquote></div><p>Ну в явном виде нет, но если немного покреативить, то опять же всё возможно:</p><div class="codebox"><pre><code>
Option Explicit

Dim strLog, iReq

RunInConsoleMode()

RequestURL &quot;http://www.planet-source-code.com&quot;
RequestURL &quot;http://www.google.ru&quot;
RequestURL &quot;http://www.rambler.ru&quot;
RequestURL &quot;http://www.yandex.ru&quot;
RequestURL &quot;http://www.vesti.ru&quot;

Sub RequestURL(url)
	Dim objXHR, objCaller
	iReq = iReq + 1
	Set objCaller = new clsCaller
	Set objXHR = CreateObject(&quot;MSXML2.ServerXMLHTTP.6.0&quot;)
	With objCaller
		.Args = Array(objXHR, Now, url)
		Set .callback =  GetRef(&quot;xhr_onreadystatechange&quot;)
	End With
	WScript.Echo &quot;Requesting &quot;&quot;&quot; &amp; url &amp; &quot;&quot;&quot;&quot;
	With objXHR
		.open &quot;GET&quot;, url, true
		.setRequestHeader &quot;Cache-Control&quot;, &quot;no-cache&quot;
		.setRequestHeader &quot;If-Modified-Since&quot;, &quot;Sat, 1 Jan 2000 00:00:00 GMT&quot;
		.onreadystatechange = objCaller
		.send
	End With
End Sub

Sub xhr_onreadystatechange(objXHR, requestStarted, url)
	Dim strReadyStateText
	Select Case objXHR.readyState
	Case 0
		strReadyStateText = &quot;Unsent&quot;
	Case 1
		strReadyStateText = &quot;Opened&quot;
	Case 2
		strReadyStateText = &quot;Headers received&quot;
	Case 3
		strReadyStateText = &quot;Loading&quot;
	Case 4
		strReadyStateText = &quot;Done&quot;
	End Select
	WScript.Echo strReadyStateText &amp; &quot; &quot; &amp; url &amp; &quot; &quot; &amp; FormatDateTime(Now - requestStarted, vbLongTime)
	if objXHR.readyState &lt;&gt; 4 Then Exit Sub
	iReq = iReq - 1
End Sub

While iReq &gt; 0
	WScript.Sleep 100
Wend

WScript.Echo &quot;Complete.... Please, press &lt;ENTER&gt;&quot;

WScript.StdIn.ReadLine

Class clsCaller
	Public callback, args
	Public Default Function [call]()
		Dim code, i
		For i = Lbound(args) to Ubound(args)
			code = code &amp; &quot;, args(&quot; &amp; i &amp; &quot;)&quot;
		Next
		Stub Eval(&quot;callback(&quot; &amp; mid(code,2) &amp; &quot;)&quot;), [call] 
	End Function

	Private Sub Stub(p1, p2)
		If isObject(p1) Then
			Set p2 = p1
		Else
			p2 = p1
		End If
	End Sub
End Class

Sub RunInConsoleMode()
	If InStr(1,WScript.FullName,&quot;cscript&quot;,1) &lt;= 0 Then 
		CreateObject(&quot;WScript.Shell&quot;).Run(&quot;cscript /nologo &quot;&quot;&quot; &amp; WScript.ScriptFullName &amp; &quot;&quot;&quot;&quot;)
		WScript.Quit
	End If
End Sub
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 27 Nov 2017 17:08:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121704#p121704</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121671#p121671</link>
			<description><![CDATA[<p>По граблям побегать немножко успел, получилось, что конкретно в моей реализации параллельности не получилось. Сначала начала выполняться функция, идущая следом за отложенным вызовом, потом, когда подходит время для отложенной функции, начинает выполняться она, а первая приостанавливается, а уже после завершения отложенной продолжает работу первая.<br />Насчёт разброса по контекстам - да, неудобно, особенно если одну и ту же функцию вызываешь и так, и так.<br />Спасибо за очередную пищу для размышлений, буду изучать и пробовать.<br />---<br />К сожалению, GetRef не даёт передать аргументы, что не очень удобно.</p>]]></description>
			<author><![CDATA[null@example.com (fy73)]]></author>
			<pubDate>Sun, 26 Nov 2017 18:22:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121671#p121671</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121668#p121668</link>
			<description><![CDATA[<div class="quotebox"><cite>fy73 пишет:</cite><blockquote><p>... И прекрасно работает конструкция </p><div class="codebox"><pre><code>Win.SetTimeout &quot;Main.Control &quot;,5000,&quot;VBScript&quot;</code></pre></div></blockquote></div><p>Чтож, вполне себе решение. Однако, я считаю, что разбрасывать код по контекстам - не есть лучшая практика, и в контексте HTA его должен быть минимум, поэтому подразумевал что-то навроде такого кода в скрипте VBS:</p><div class="codebox"><pre><code>Win.SetTimeout GetRef(&quot;Control&quot;), 5000

Sub Control
    &#039; здесь код
Sub</code></pre></div><p>В этом случае передавать Me нет необходимости.<br /></p><div class="quotebox"><cite>fy73 пишет:</cite><blockquote><p>... да ещё и (видимо) распараллеливать вычисления</p></blockquote></div><p>В общем-то это возможно, поскольку в Вашем случае запущено 2 процесса. Но перед забегом по граблям советую почитать <a href="http://forum.script-coding.com/viewtopic.php?id=5573">это</a> и <a href="http://forum.script-coding.com/viewtopic.php?id=9428">это</a>. Относительно годное решение я предлагал <a href="http://forum.script-coding.com/viewtopic.php?pid=74388#p74388">тут</a>, правда, это было давно, с тех пор мне стало очевидно, что код может быть значительно улучшен.</p>]]></description>
			<author><![CDATA[null@example.com (omegastripes)]]></author>
			<pubDate>Sun, 26 Nov 2017 17:39:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121668#p121668</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121615#p121615</link>
			<description><![CDATA[<p>Спасибо, не всё понял, но буду экспериментировать.<br />SetTimeout из основного скрипта мне удалось вызвать в форме Win.SetTimeout, где Win - переменная, ссылающаяся на созданное окно (возвращаемая функцией CreateWindow). При этом запустить отложено таким образом можно только функцию, которая описана в &quot;оконном&quot; VBS.<br />---<br />Всё отлично получилось.<br />В текст открываемого окна добавил описание переменной Main, затем после открытия окна </p><div class="codebox"><pre><code>Set Win.Main=Me</code></pre></div><p>И прекрасно работает конструкция </p><div class="codebox"><pre><code>Win.SetTimeout &quot;Main.Control &quot;,5000,&quot;VBScript&quot;</code></pre></div><p>Где Control - функция, описанная в основном скрипте.<br />Ещё раз большое спасибо. Теперь можно полностью пользоваться преимуществами обеих форм VBS, да ещё и (видимо) распараллеливать вычисления.</p>]]></description>
			<author><![CDATA[null@example.com (fy73)]]></author>
			<pubDate>Sat, 25 Nov 2017 08:54:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121615#p121615</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121614#p121614</link>
			<description><![CDATA[<p>Необходимый код в <strong>контексте окна</strong> можно выполнить после его создания, используя window.execScript(). Это позволит и добавить функцию, и вызвать setTimeout(), из <strong>контекста скрипта VBS</strong>.</p><p>Я бы все же попробовал разместить целевую функцию в коде скрипта VBS, передать Me скрипта в качестве свойства window, а по таймауту запускать короткую функцию-переходник, которая бы просто вызывала целевую функцию через Me.MyFunction(). Либо, в качестве альтернативы, передать в setTimeout ссылку на целевую функцию, полученную через GetRef().</p><p>Кстати, вот <a href="http://forum.script-coding.com/viewtopic.php?pid=120959#p120959">такое</a> решение может Вам показаться интересным.</p>]]></description>
			<author><![CDATA[null@example.com (omegastripes)]]></author>
			<pubDate>Sat, 25 Nov 2017 08:06:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121614#p121614</guid>
		</item>
		<item>
			<title><![CDATA[VBS,HTA: Скрипты вне окна и внутри его]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=121529#p121529</link>
			<description><![CDATA[<p>Плотно и часто использую динамическое создание окна HTA из скрипта VBS, почерпнутое мной из темы <a href="http://forum.script-coding.com/viewtopic.php?id=4196">JScript: Создание окна, а также трансляция WScript в HTA</a>. Умею только на VBS, поэтому использую конкретно <a href="http://forum.script-coding.com/viewtopic.php?pid=45858#p45858">этот</a> вариант.<br />В текущий момент стоит задача проверить корректную читаемость нескольких тысяч файлов в формате ai (Adobe Illustrator).<br />Всё хорошо до тех пор, пока Illustrator не открывает диалоговое окошко с каким-нибудь вопросом или сообщением. В этом случае всё останавливается и ждёт, пока пользователь отреагирует.<br />Возникла идея использовать имитацию нажатия клавиш (метод SendKeys из библиотеки WScript.Shell).<br />Для того, чтобы всё сработало как надо, необходимо перед попыткой открытия файла отложенно запустить функцию с проверкой, не висит ли скрипт, и с необходимыми действиями по имитации нажатия клавиш (метод SetTimeout).<br />Однако, данный метод работает только в &quot;оконном VBS&quot;. После экспериментов выяснилось, что если внести нужную функцию в текст, передаваемый в функцию динамического открытия окна HTA, то эту функцию можно вызвать с помощью метода SetTimeout. Простейшая проверка (отображение номера файла) показала работоспособность такого вызова: при нормальном открытии файлов функция, которая вызывается отложенно, отображает номера файлов с запаздыванием на несколько единиц, а когда открывается диалоговое окно и скрипт замирает, номера доходят до текущего.<br />Но тут появляется новая сложность: если метод SetTimeout доступен только в &quot;оконном VBS&quot;, то объект WScript в нём никак невозможен.<br />В связи с этим вопрос: возможно ли как-то из &quot;оконного VBS&quot; обратиться к функциям из главного скрипта, породившего это окно? Или ещё какой-то способ?<br />В качестве запасного варианта держу возможность дополнительного скрипта, который бы запускался из функции, вызываемой методом SetTimeout, но хотелось бы по возможности обойтись одним скриптом.</p>]]></description>
			<author><![CDATA[null@example.com (fy73)]]></author>
			<pubDate>Thu, 23 Nov 2017 12:08:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=121529#p121529</guid>
		</item>
	</channel>
</rss>
