<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10251&amp;type=atom" />
	<updated>2014-12-17T07:38:09Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10251</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89503#p89503" />
			<content type="html"><![CDATA[<p>После завершения всех действий кроме закрытия, разумеется.<br />Если консоль не требует скрытия, то зачем вообще какие-то иные окна?<br />Можно вводить данные через InputBox и передавать через WriteLine. Только нужно заведомо знать на каком этапе выводить информацию, знать число последующих строк.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-17T07:38:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89503#p89503</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89500#p89500" />
			<content type="html"><![CDATA[<p>Но тут вы запускаете Exe.StdOut.ReadAll уже <em>после</em> завершения работы программы?</p><p>Дело в следующем.<br />Я сейчас ввожу в программу данные просто через эмуляцию ввода с клавиатуры и пауз WScript.Sleep t<br />В некоторый момент программа начинает расчёт, который может длиться 2 секунды, а может 20 минут. Я сейчас вычисляю требуемую паузу &quot;на глазок&quot;. А вместо этого хотел следить, когда программа сообщит на экране об окончании расчёта, и затребует дальнейший ввод с клавиатуры.<br />Т. е. хотел циклически Do While… WScript.Sleep 100 :Loop проверять последнюю выведенную на экран строку.</p><p>С помощью варианта с WinAPI:ReadConsoleOutputCharacter вроде получается.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T23:59:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89500#p89500</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89499#p89499" />
			<content type="html"><![CDATA[<div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Либо так:</div><div class="fancy_spoiler"><div class="codebox"><pre><code>n = 5 &#039; число последних строк

With CreateObject(&quot;WScript.Shell&quot;)
  If InStrRev(WScript.FullName, &quot;WScript.exe&quot;) Then
    .Run &quot;CScript.exe //NoLogo &quot;&quot;&quot; &amp; WScript.ScriptFullName &amp; &quot;&quot;&quot;&quot;, 0
    WScript.Quit
  Else
    Set Exe = .Exec(&quot;RADMODLS.EXE&quot;)
    For i = 1 to 12 : Exe.StdIn.WriteLine &quot;N&quot; : Next
    All = Split(Exe.StdOut.ReadAll, vbnewline) : Max = Ubound(All)
    For i = Max - n to Max - 1 : S = S &amp; vbNewLine &amp; All(i) : Next
    .Popup Mid(S, 3)
  End If
End With</code></pre></div></div></div>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T23:41:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89499#p89499</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89498#p89498" />
			<content type="html"><![CDATA[<p>Ok.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T23:28:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89498#p89498</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89497#p89497" />
			<content type="html"><![CDATA[<p>Сразу никак (точнее <a href="http://forum.script-coding.com/viewtopic.php?id=4713">проблематично</a>). Конкретно тут нужно подсчитать число пропускаемых строк сначала и пройтись циклом For/to, вызывая Exe.StdOut.SkipLine, а потом уже читать через ReadAll.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T23:27:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89497#p89497</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89496#p89496" />
			<content type="html"><![CDATA[<p>А как в некоторый момент, <em>до завершения работы программы</em>, прочитать n последних символов вывода?<br />С помощью .StdOut.Read(n) или ReadLine листать с начала… но не соображу, как определить, где &quot;текущий конец&quot; StdOut.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T23:08:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89496#p89496</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89495#p89495" />
			<content type="html"><![CDATA[<p>Зaменил MsgBox, пусть хоть побольше влезает.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T22:52:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89495#p89495</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89494#p89494" />
			<content type="html"><![CDATA[<p>Я там малюсенькую правку ранее вносил, после кот. не должно этого быть.</p><div class="quotebox"><blockquote><p>Какой-то один подвисший ntvdm.exe в списке процессов мешал.</p></blockquote></div><p>Есть убрать, то с первого раза и старый вариант сработает. Нужно использовать текущий.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T22:43:36Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89494#p89494</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89493#p89493" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><p>Кавычку добавил. Проверьте. В пути, наверно, пробелы есть.</p></blockquote></div><p>Теперь заработало. Почти ) Показывает MsgBox только после того, как через диспетчер задач убить процесс ntvdm.exe :-/</p><p>UPD: А, всё, заработало нормально. Один подвисший ntvdm.exe в списке процессов мешал.</p><p>Большое спасибо.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T22:40:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89493#p89493</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89492#p89492" />
			<content type="html"><![CDATA[<p>Кавычку добавил. Проверьте. В пути, наверно, пробелы есть.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T22:28:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89492#p89492</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89491#p89491" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><p>Скрипт должен лежать в той же папке, что и программа, запускать обычным вызовом по Enter/даблклик.</p></blockquote></div><p>Да, всё так и делаю.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T22:20:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89491#p89491</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89490#p89490" />
			<content type="html"><![CDATA[<p>Скрипт должен лежать в той же папке, что и программа, запускать обычным вызовом по Enter/даблклик.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T22:17:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89490#p89490</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89489#p89489" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><p>вот что у меня вышло:</p></blockquote></div><p>Э-мм, а у меня это не работает.<br />Всегда выполняется условие If InStrRev(WScript.FullName, &quot;WScript.exe&quot;).<br />Если конструкцию If убрать и оставить только кусок Set Exe = .Exec… MsgBox Exe.StdOut.ReadAll, то программа запускается и тут же закрывается, а скрипт выдаёт ошибку:<br />Ошибка: Идёт закрытие канала.<br />Код: 800700E8<br />Источник: (null)</p><p>ОС Windows 7 32-бит, пользователь с правами администратора.</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T22:15:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89489#p89489</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89488#p89488" />
			<content type="html"><![CDATA[<p>Система &quot;ниппель&quot;, конечно, но вот что у меня вышло:<br /></p><div class="codebox"><pre><code>With CreateObject(&quot;WScript.Shell&quot;)
  If InStrRev(WScript.FullName, &quot;WScript.exe&quot;) Then
    .Run &quot;CScript.exe //NoLogo &quot;&quot;&quot; &amp; WScript.ScriptFullName &amp; &quot;&quot;&quot;&quot;, 0
  Else
    Set Exe = .Exec(&quot;RADMODLS.EXE&quot;)
    For i = 1 to 12
      Exe.StdIn.WriteLine &quot;N&quot;
    Next
    .PopUp Exe.StdOut.ReadAll
  End If
End With</code></pre></div><p>Хотя я вообще не понял, зачем нужно подобные программы выводить в окно, к тому же существенно ограниченное по высоте.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-12-16T21:53:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89488#p89488</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Как при помощи VBS получить текст из окна консольного приложения?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=89487#p89487" />
			<content type="html"><![CDATA[<p>Заработал такой код<br /></p><div class="codebox"><pre><code>Set ws = WScript.CreateObject(&quot;WScript.Shell&quot;)

Set DX = CreateObject(&quot;DynamicWrapperX&quot;)

DX.Register &quot;user32.dll&quot;,   &quot;GetForegroundWindow&quot;,                    &quot;r=h&quot;
DX.Register &quot;user32.dll&quot;,   &quot;GetWindowThreadProcessId&quot;,  &quot;i=hL&quot;,      &quot;r=l&quot;
DX.Register &quot;kernel32.dll&quot;, &quot;AttachConsole&quot;,             &quot;i=l&quot;,       &quot;r=l&quot;
DX.Register &quot;kernel32.dll&quot;, &quot;GetStdHandle&quot;,              &quot;i=l&quot;,       &quot;r=h&quot;
DX.Register &quot;kernel32.dll&quot;, &quot;ReadConsoleOutputCharacter&quot;,&quot;i=hSlpL&quot;,   &quot;r=l&quot;

ws.Run(&quot;abcd.exe&quot;) :WScript.Sleep 2000

wh = DX.GetForegroundWindow()
pid= 0
wh = DX.GetWindowThreadProcessId(wh, pid)
res= DX.AttachConsole(pid)
sh = DX.GetStdHandle(-11)

n = 100
s = Space(n)

x = 10 :y = 3  &#039;координаты экрана, откуда надо начинать чтение
coord = y*2^16 + x

res = DX.ReadConsoleOutputCharacter(sh, s, n, coord, n)

msgbox(s)</code></pre></div><p>:)</p>]]></content>
			<author>
				<name><![CDATA[404]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32755</uri>
			</author>
			<updated>2014-12-16T21:26:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=89487#p89487</id>
		</entry>
</feed>
