1

Тема: VBScript: «незакрываемый» MsgBox на заданное время

Arlekin_s пишет:

Как сообщение типа WScript.Echo "Hello, world!!" сделать чтобы оно не закрывалось или его нельзя было закрыть определенное количество секунд.

Сделать такое напрямую невозможно. Эмуляция подобного поведения может выглядеть наподобие:

Option Explicit

Dim objWshShell

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


Set objWshShell = WScript.CreateObject("WScript.Shell")

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

intTimeStartShowing = Timer                                                    ' Засекаем время

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

Set objWshShell = Nothing

WScript.Quit 0

Реализация была навеяна обсуждением VBScript: как определить оставшееся время выполнения?.

Дополнение от 01.06.2012: с некоторого времени стиль «WS_EX_TOPMOST» окна MessageBox, устанавливаемый константой «MB_TOPMOST» («&H40000» в скрипте), стал препятствовать закрытию окна MessageBox по таймауту — таймаут просто игнорируется. Если у Вас наблюдается такое поведение, просто уберите «+ &H40000» из вызова метода «.Popup()».

Отдельное спасибо за найденную особенность поведения — -TOXA-.