<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: «незакрываемый» MsgBox на заданное время]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2801&amp;type=atom" />
	<updated>2009-02-19T06:33:39Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=2801</id>
		<entry>
			<title type="html"><![CDATA[VBScript: «незакрываемый» MsgBox на заданное время]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=19670#p19670" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Arlekin_s пишет:</cite><blockquote><p>Как сообщение типа WScript.Echo &quot;Hello, world!!&quot; сделать чтобы оно не закрывалось или его нельзя было закрыть определенное количество секунд.</p></blockquote></div><p>Сделать такое напрямую невозможно. Эмуляция подобного поведения может выглядеть наподобие:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objWshShell

Dim intTime4Show                                                               &#039; Заданное (оно же максимально возможное) время показа сообщения
Dim intMinimumTime                                                             &#039; Минимальное время показа сообщения
Dim intTimeStartShowing                                                        &#039; Время начала показа сообщения
Dim intRetValue                                                                &#039; Возвращаемое значение метода .Popup


Set objWshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)

intTime4Show    = 60                                                           &#039; Заданное    время показа сообщения — 1 минута
intMinimumTime  = 10                                                           &#039; Минимальное время показа сообщения — 10 секунд

intTimeStartShowing = Timer                                                    &#039; Засекаем время

Do
    &#039; Выводим сообщение поверх всех окон [&amp;H40000] на оставшееся на текущий момент,
    &#039; от заданного, время [intTime4Show - (Timer - intTimeStartShowing)]
    intRetValue = objWshShell.Popup( _
        &quot;Здесь&quot; &amp; vbCrLf &amp; &quot;некий&quot; &amp; vbCrLf &amp; &quot;текст&quot;, _
        intTime4Show - (Timer - intTimeStartShowing), _
        &quot;Тут заголовок&quot;, _
        vbOKOnly + vbInformation + &amp;H40000)
    
    &#039; Повторяем вывод сообщения, пока не будет выполнено одно из условий:
    &#039; 1. Истечёт отведённое время и сообщение будет закрыто по таймауту [intRetValue = -1]
    &#039; 2. Сообщение будет закрыто вручную и с момента первого показа
    &#039;    сообщения до текущего момента пройдёт не менее минимального [intMinimumTime]
    &#039;    времени [(Timer - intTimeStartShowing) &gt; intMinimumTime]
Loop Until intRetValue = -1 Or (Timer - intTimeStartShowing) &gt; intMinimumTime

Set objWshShell = Nothing

WScript.Quit 0</code></pre></div><p>Реализация была навеяна обсуждением <a href="http://forum.script-coding.com/viewtopic.php?id=2753">VBScript: как определить оставшееся время выполнения?</a>.</p><p><em>Дополнение от 01.06.2012:</em> с некоторого времени стиль «WS_EX_TOPMOST» окна MessageBox, устанавливаемый константой «MB_TOPMOST» («&amp;H40000» в скрипте), стал препятствовать закрытию окна MessageBox по таймауту — таймаут просто игнорируется. Если у Вас наблюдается такое поведение, просто уберите «+ &amp;H40000» из вызова метода «.Popup()».</p><p>Отдельное спасибо за найденную особенность поведения — <strong><a href="http://forum.script-coding.com/profile.php?id=28061">-TOXA-</a></strong>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-02-19T06:33:39Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=19670#p19670</id>
		</entry>
</feed>
