Что нового

MsgBox ModeLess (не останавливает скрипт)

VadimKHL

Новичок
Сообщения
155
Репутация
0
Есть возможность сделать MsgBox, которая не останавливает работу скрипта?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
MsgBox это окно, текстовое поле и кнопка. Ничего не мешает написать свой вариант с теми характеристиками что нужны.
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Автоит однопоточный, поэтому если вывод MsgBox'а будет в этом же скрипте, то нельзя.
Чтобы работа скрипта не останавливалась можно выполнить другой исполняемый файл, который выведет MsgBox.
Или можно без отдельного файла отправить на выполнение код VBScript в @comspec
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
MsgBox это окно, текстовое поле и кнопка. Ничего не мешает написать свой вариант с теми характеристиками что нужны.
Ясно. Тогда буду писать свой MsgBox...

Автоит однопоточный, поэтому если вывод MsgBox'а будет в этом же скрипте, то нельзя.
Чтобы работа скрипта не останавливалась можно выполнить другой исполняемый файл, который выведет MsgBox.
Или можно без отдельного файла отправить на выполнение код VBScript в @comspec
Ну это очень коряво в плане реализации.
Сообщение автоматически объединено:

Помогите найти нужный стиль. Не могу подобрать что бы иконки не было и только кнопка закрыть, как у оригинального MsgBox.
Код:
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)  ; Включить режим OnEventMode.
Global $MsgBox
Global $TextToTest
;$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
;$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
;$TextToTest = ""

_MsgBoxMy($MB_ICONERROR, "", $TextToTest)
_MsgBoxMy($MB_ICONQUESTION, "", $TextToTest)
_MsgBoxMy($MB_ICONWARNING, "", $TextToTest)
_MsgBoxMy($MB_ICONINFORMATION, "", $TextToTest)
;MsgBox($MB_ICONINFORMATION, "", $TextToTest)

While 1
    Sleep(10)
WEnd
Exit

Func _MsgBoxMy(Const $flag, Const $title, Const $text, $timeout = 0)
    Local $Icon
    Local $SpaceTextLeft
    Local $SpaceTextRight
    Local $SpaceTextTop
    Local $SpaceTextDown
    ; Задать размер заголовка окна.
    Local $TitleSize = 30

    ; Создать окно.
    $MsgBox = GUICreate($title, 1, 1, -1, -1, $WS_DLGFRAME)
    GUISetBkColor(0xFFFFFF, $MsgBox)
    ; Создать тестовый лабел, с авторазмером.
    Local $Label = GUICtrlCreateLabel($text, 0, 0, -1, -1)
    ; Получить размеры лабел с текстом.
    Local $aPos = ControlGetPos($MsgBox, "", $Label)

    ; Выбрать иконку.
    Select
        Case BitAND(112, $flag) = $MB_ICONERROR
            $Icon = 98
        Case BitAND(112, $flag) = $MB_ICONQUESTION
            $Icon = 99
        Case BitAND(112, $flag) = $MB_ICONWARNING
            $Icon = 84
        Case BitAND(112, $flag) = $MB_ICONINFORMATION
            $Icon = 81
        Case Else
            $Icon = 0
    EndSelect

    ; Создать иконку и спозиционировать текст.
    If $Icon Then
        GUICtrlCreateIcon("imageres.dll", $Icon, 25, 26, 32, 32)
        ; Задать отступы.
        $SpaceTextLeft = 65
        $SpaceTextRight = 36
        If $aPos[3] > 25 Then
            $SpaceTextTop = 26
        Else
            $SpaceTextTop = 34
        EndIf
        $SpaceTextDown = 18
        GUICtrlSetPos($Label, $SpaceTextLeft, $SpaceTextTop, -1, -1)
    Else
        ; Задать отступы.
        $SpaceTextLeft = 12
        $SpaceTextRight = 12
        $SpaceTextTop = 26
        $SpaceTextDown = 18
        GUICtrlSetPos($Label, $SpaceTextLeft, $SpaceTextTop, -1, -1)
    EndIf

    ; Расчет ширины окна.
    Local $WinW = $SpaceTextLeft + $aPos[2] + $SpaceTextRight
    If $WinW < 144 Then $WinW = 144
    ; Расчет высоты окна.
    Local $WinH = $SpaceTextTop + $aPos[3] + $SpaceTextDown + $TitleSize + 30
    If $WinH < 144 Then $WinH = 144
    ; Изменить размеры окна под лабел.
    WinMove($MsgBox, "", @DesktopWidth/2-$WinW/2, @DesktopHeight/2-$WinH/2, $WinW, $WinH)

    ; Создать кнопку "OK" для выхода.
    Local $ButOK = GUICtrlCreateButton("OK", ($WinW-88)/2, $WinH-35-$TitleSize, 88, 25)
    GUICtrlSetState($ButOK, $GUI_FOCUS)
    GUICtrlSetOnEvent($ButOK, "_EventMsgBox")

    ; Показать окно.
    GUISetState(@SW_SHOW, $MsgBox)
EndFunc

Func _EventMsgBox()
    ;MsgBox($MB_SYSTEMMODAL, "BUT Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle & " CtrlHandle=" & @GUI_CtrlHandle)
    If WinExists(@GUI_WinHandle) Then
        GUIDelete(@GUI_WinHandle)
    EndIf
EndFunc
 
Последнее редактирование:
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Я про это:
Новый точечный рисунок.jpg
Сообщение автоматически объединено:

Слева мой MsgBox, справа оригинал.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Код:
$MsgBox = GUICreate($title, 1, 1, -1, -1, BitOR($WS_DLGFRAME, $WS_SYSMENU))
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Есть возможность сделать MsgBox, которая не останавливает работу скрипта?
Если не важно возвращаемое значение от окна и заголовок, тогда смотрите ниже.
Вариант 1:
Код:
$sSting = 'Hello World'
Run('msg ' & @UserName & ' ' & $sSting, '', @SW_HIDE)

For $i = 1 To 10 ; Имитация работы
    ConsoleWrite('Работаю ' & $i & @LF)
    Sleep(100)
Next
Вариант 2:
Код:
$sSting = 'Hello World'
$iPid = Run('PowerShell -Command "Add-Type -AssemblyName PresentationFramework;[System.Windows.MessageBox]::Show(''' & $sSting & ''')"', '', @SW_HIDE)

For $i = 1 To 10 ; Имитация работы
    ConsoleWrite('Работаю ' & $i & @LF)
    Sleep(100)
Next

If MsgBox(262144 + 4, Default, 'Сейчас выключусь. Удалить первое окно?') = 6 Then ProcessClose($iPid)
Вариант 3:
Код:
$sSting = 'Hello World'
$iPid = Run('mshta vbscript:Execute("msgbox ""' & $sSting & '"":close")', '', @SW_HIDE)

For $i = 1 To 10 ; Имитация работы
    ConsoleWrite('Работаю ' & $i & @LF)
    Sleep(100)
Next

If MsgBox(262144 + 4, Default, 'Сейчас выключусь. Удалить первое окно?') = 6 Then ProcessClose($iPid)
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Интересные варианты. Спасибо!
Сообщение автоматически объединено:

Подскажите пожалуйста, почему нельзя убивать таймер в функции CallBack этого таймера?
Так все хорошо получается, если это игнорировать (работает правильно):
Код:
#AutoIt3Wrapper_Res_Icon_Add=Icon.ico, 243
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>

Global Const $MB_ICONAPP = 112  ; Вывод своей иконки (№243) в _MsgBoxMy().
Opt("GUIOnEventMode", 1)  ; Включить режим OnEventMode.
Global $TextToTest
;$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
;$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
$TextToTest = "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH" & @CRLF & "Text Text Text Text Text Text Text Text Text Text ABCDEFGH"
;$TextToTest = ""

;_MsgBoxMy($MB_ICONERROR, "MyMsgBox", $TextToTest, 3)
;_MsgBoxMy($MB_ICONQUESTION+$MB_CANCELTRYCONTINUE, "MyMsgBox", $TextToTest)

_MsgBoxMy($MB_ICONAPP, "MyMsgBox", $TextToTest, 5)
_MsgBoxMy($MB_ICONERROR, "MyMsgBox", $TextToTest, 4)
_MsgBoxMy($MB_ICONQUESTION, "MyMsgBox", $TextToTest, 3)
_MsgBoxMy($MB_ICONWARNING, "MyMsgBox", $TextToTest, 2)
_MsgBoxMy($MB_ICONINFORMATION, "MyMsgBox", $TextToTest, 1)

While 1
    Sleep(10)
WEnd
Exit

; ====================================================================================================================
; Диалоговое окно, без остановки скрипта, V06.
; ====================================================================================================================
Func _MsgBoxMy(Const $flag, Const $title, Const $text, $timeout = 0, $hwind = 0)
    Local $Ret
    Local $Icon
    Local $SpaceTextLeft
    Local $SpaceTextRight
    Local $SpaceTextTop
    Local $SpaceTextDown
    ; Задать размер заголовка окна.
    Local $TitleSize = 30

    ; Если диалоговое окно не только с кнопкой OK,
    ; запустить стандартный MsgBox.
    If BitAnd(7, $flag) Then
        If $hwind Then
            $Ret = MsgBox($flag, $title, $text, $timeout, $hwind)
        Else
            $Ret = MsgBox($flag, $title, $text, $timeout)
        EndIf
        Return $Ret
    EndIf

    ; Создать окно.
    Local $MsgBox = GUICreate($title, 1, 1, -1, -1, $WS_DLGFRAME)
    GUISetBkColor(0xFFFFFF, $MsgBox)
    ; Создать тестовый лабел, с авторазмером.
    Local $Label = GUICtrlCreateLabel($text, 0, 0, -1, -1)
    ; Получить размеры лабел с текстом.
    Local $aPos = ControlGetPos($MsgBox, "", $Label)

    ; Выбрать иконку.
    Select
        Case BitAND(112, $flag) = $MB_ICONAPP
            $Icon = -1
        Case BitAND(112, $flag) = $MB_ICONERROR
            $Icon = 98
        Case BitAND(112, $flag) = $MB_ICONQUESTION
            $Icon = 99
        Case BitAND(112, $flag) = $MB_ICONWARNING
            $Icon = 84
        Case BitAND(112, $flag) = $MB_ICONINFORMATION
            $Icon = 81
        Case Else
            $Icon = 0
    EndSelect

    ; Создать иконку и спозиционировать текст.
    If $Icon Then
        If $Icon = -1 Then
            GUICtrlCreateIcon(@ScriptFullPath, 243, 25, 26, 32, 32)
        Else
            GUICtrlCreateIcon("imageres.dll", $Icon, 25, 26, 32, 32)
        EndIf

        ; Задать отступы.
        $SpaceTextLeft = 65
        $SpaceTextRight = 36
        If $aPos[3] > 25 Then
            $SpaceTextTop = 26
        Else
            $SpaceTextTop = 34
        EndIf
        $SpaceTextDown = 18
        GUICtrlSetPos($Label, $SpaceTextLeft, $SpaceTextTop, -1, -1)
    Else
        ; Задать отступы.
        $SpaceTextLeft = 12
        $SpaceTextRight = 12
        $SpaceTextTop = 26
        $SpaceTextDown = 18
        GUICtrlSetPos($Label, $SpaceTextLeft, $SpaceTextTop, -1, -1)
    EndIf

    ; Расчет ширины окна.
    Local $WinW = $SpaceTextLeft + $aPos[2] + $SpaceTextRight
    If $WinW < 144 Then $WinW = 144
    ; Расчет высоты окна.
    Local $WinH = $SpaceTextTop + $aPos[3] + $SpaceTextDown + $TitleSize + 30
    If $WinH < 144 Then $WinH = 144
    ; Изменить размеры окна под лабел.
    WinMove($MsgBox, "", @DesktopWidth/2-$WinW/2, @DesktopHeight/2-$WinH/2, $WinW, $WinH)

    ; Создать кнопку "OK" для выхода.
    Local $ButOK = GUICtrlCreateButton("OK", ($WinW-88)/2, $WinH-35-$TitleSize, 88, 25)
    GUICtrlSetState($ButOK, $GUI_FOCUS)
    GUICtrlSetOnEvent($ButOK, "_EventMsgBox")

    ; Если диалоговое окно с таймером, запустить таймер.
    If $timeout Then
        _Timer_SetTimer($MsgBox, $timeout*1000, "_TimerMsgBox")
    EndIf

    ; Показать окно.
    GUISetState(@SW_SHOW, $MsgBox)
EndFunc

Func _TimerMsgBox($hWnd, $iMsg, $iIDTimer, $iTime)
    If WinExists($hWnd) Then
        GUIDelete($hWnd)
    EndIf
    _Timer_KillTimer($hWnd, $iIDTimer)
EndFunc

Func _EventMsgBox()
    If WinExists(@GUI_WinHandle) Then
        GUIDelete(@GUI_WinHandle)
    EndIf
EndFunc
 
Последнее редактирование:
Верх