Что нового

MsgBox() без остановки кода и с возвращением результата

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я тут подумал, а почему бы это не сделать так:

Код:
#Include <WinAPIEx.au3>

$PID = Run(@AutoItExe & ' /AutoIt3ExecuteLine "Exit MsgBox(51, ''Message'', ''Simple text.'')"')
$hProcess = _WinAPI_OpenProcess(0x0400, 0, $PID)

While 1
	$Code = _WinAPI_GetExitCodeProcess($hProcess)
	Switch $Code
		Case 259 ; STILL_ACTIVE

		Case Else
			Switch $Code
				Case 2
					MsgBox(64, '', 'You presed Cancel button.')
				Case 6
					MsgBox(64, '', 'You presed Yes button.')
				Case 7
					MsgBox(64, '', 'You presed No button.')
			EndSwitch
			ExitLoop
	EndSwitch
WEnd

_WinAPI_CloseHandle($hProcess)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484
Интересный способ, но зачем так сложно:

Код:
$PID = Run(@AutoItExe & ' /AutoIt3ExecuteLine "ConsoleWriteError(MsgBox(51, ''Message'', ''Simple text.''))"', '', '', 4)

$sRead = ""

While ProcessExists($PID)
    $sRead &= StderrRead($PID)
	If @error Then ExitLoop
	
	Sleep(10)
WEnd

MsgBox(64, 'Results', $sRead)
 
  • Like
Реакции: Norm

sss

Продвинутый
Сообщения
332
Репутация
96
А вот и вариант от меня с использованием Adlib
Код:
Global $msg, $complete

AdlibRegister('Msg',1)

Do
until $complete=0

While 1
    Switch $msg
      Case 2
            MsgBox(64, '', 'You presed Cancel button.')
         Exit
        Case 6
            MsgBox(64, '', 'You presed Yes button.')
         Exit
        Case 7
            MsgBox(64, '', 'You presed No button.')
         Exit
   EndSwitch
WEnd

Func Msg()
   AdlibUnregister('Msg')
   $msg=MsgBox(51,'Message','Simple text')
   $complete=1
EndFunc
Скрипт нерабочий
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484
Sky-WaLkeR [?]
вот и вариант от меня с использованием Adlib
Вариант нерабочий, поставь ConsoleWrite("Looping..." & @LF) в цикл и увидишь что скрипт останавливает своё выполнение.
 

sss

Продвинутый
Сообщения
332
Репутация
96
Точно... Извиняюсь, скрипт действительно нерабочий, не заметил.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484
Вариант с функциями:

Код:
#Include <WinAPIEx.au3>
#Include <MsgBoxConstants.au3>

$hMsgBox = _MsgBox_Create(BitOR($MB_ICONQUESTION, $MB_YESNOCANCEL), 'Title', 'Text', 3)

Do
    $iCode = _MsgBox_GetCode($hMsgBox)
Until $iCode <> 259 ;STILL_ACTIVE

Switch $iCode
	Case $IDCANCEL
		MsgBox(64, '', 'You presed Cancel button.')
	Case $IDYES
		MsgBox(64, '', 'You presed Yes button.')
	Case $IDNO
		MsgBox(64, '', 'You presed No button.')
	Case $IDTIMEOUT, 4294967295
		MsgBox(64, '', 'MsgBox timed out.')
EndSwitch

_MsgBox_Close($hMsgBox)

Func _MsgBox_Create($iFlags, $sTitle, $sText, $iTimeout = 0, $hWnd = 0)
	Local $iPID = Run(@AutoItExe & ' /AutoIt3ExecuteLine "Exit MsgBox(' & $iFlags & ', ''' & $sTitle & ''', ''' & $sText & ''', ' & $iTimeout & ', ' & $hWnd & ')"')
	Return _WinAPI_OpenProcess(0x0400, 0, $iPID)
EndFunc

Func _MsgBox_Close($hMsgBox)
	Return _WinAPI_CloseHandle($hMsgBox)
EndFunc

Func _MsgBox_GetCode($hMsgBox)
	Return _WinAPI_GetExitCodeProcess($hMsgBox)
EndFunc
 
Верх