Ясно. Тогда буду писать свой MsgBox...MsgBox это окно, текстовое поле и кнопка. Ничего не мешает написать свой вариант с теми характеристиками что нужны.
Ну это очень коряво в плане реализации.Автоит однопоточный, поэтому если вывод MsgBox'а будет в этом же скрипте, то нельзя.
Чтобы работа скрипта не останавливалась можно выполнить другой исполняемый файл, который выведет MsgBox.
Или можно без отдельного файла отправить на выполнение код VBScript в @comspec
#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
Вероятно значок обнулен через сообщение WM_SETICON.Не могу подобрать что бы иконки не было и только кнопка закрыть, как у оригинального MsgBox.
Если не важно возвращаемое значение от окна и заголовок, тогда смотрите ниже.Есть возможность сделать MsgBox, которая не останавливает работу скрипта?
$sSting = 'Hello World'
Run('msg ' & @UserName & ' ' & $sSting, '', @SW_HIDE)
For $i = 1 To 10 ; Имитация работы
ConsoleWrite('Работаю ' & $i & @LF)
Sleep(100)
Next
$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)
$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)
#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