Что нового

MsgBox без остановки скрипта, не пропадающий после закрытия программы

ildary

Новичок
Сообщения
49
Репутация
0
Уважаемые специалисты, подскажите пожалуйста, каким образом можно вызвать окно аля MsgBox, которое не будет останавливать выполнение программы (ожидая нажатия клавиш пользователем), а также будет продолжать висеть на экране, когда скрипт закончил работу и закрылся. Сейчас я делаю это вызовом vbs, но хочется сделать без костылей.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сделать отдельный скрипт, показывающий окно, скомпилировать в exe
и вызывать его из своего скрипта командой
Код:
Run
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
Извините, но указанные варианты не работают, потому что после завершения главного вызывающего скрипта - завершаются и вызванные им окошки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно сделать в виде функций:

Код:
#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
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ildary [?]
после завершения главного вызывающего скрипта - завершаются и вызванные им окошки
У меня подобное не наблюдается.
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
CreatoR сказал(а):
Можно сделать в виде функций:

Код:
#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

Взял вот этот код и добавил после всего текста код
Код:
MsgBox( 0, "", "Второй"  )


запустил, на экране возник первый MsgBox, пока в нем не нажал Enter - второй MsgBox не появлялся
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ildary [?]
Взял вот этот код и добавил после всего текста код
Всё верно, там же цикл ожидания. Нужно так:

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

$hMsgBox = _MsgBox_Create(BitOR($MB_ICONQUESTION, $MB_YESNOCANCEL), 'Title', 'External message')

MsgBox(64, 'Title', 'Internal message')

_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
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
Извините, все равно не получается:

Исправил в обоих окошках сообщения: у _MsgBox_Create заменил "External message" на "1", у MsgBox заменил "External message" на "2" (чтобы не путать окошки), откомпилировал, запустил (Autoit 3.3.12.0, ОС: Win2003x64), вышло окно с текстом 2, первое окно не видно.

p.s. Также хочу уточнить, а после вызова _MsgBox_Close($hMsgBox) - окно $hMsgBox случано не закроется? Мне надо, чтобы после вызова _MsgBox_Create() - это окно висело на экране, и скрипт продолжал выполняться и даже когда скрипт завершится: чтобы это окно висело, пока пользовательс не нажмет "ОК".

CreatoR сказал(а):
ildary [?]
Взял вот этот код и добавил после всего текста код
Всё верно, там же цикл ожидания. Нужно так:

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

$hMsgBox = _MsgBox_Create(BitOR($MB_ICONQUESTION, $MB_YESNOCANCEL), 'Title', 'External message')

MsgBox(64, 'Title', 'Internal message')

_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
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
ildary
http://autoit-script.ru/index.php?topic=16594.0
Как вариант ( все что вам нужно есть в примере ).
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
если речь идет об вызове через /AutoIt3ExecuteLine - то он не работает:

появляется окно с заголовком "2" - и все.

Код:
$sCode = "MsgBox(64, 'info', 'worked!')"
Run(@AutoItExe&' /AutoIt3ExecuteLine "'&$sCode&'"')

MsgBox(64, '2', '2')




firex сказал(а):
ildary
http://autoit-script.ru/index.php?topic=16594.0
Как вариант ( все что вам нужно есть в примере ).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ildary,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ildary [?]
/AutoIt3ExecuteLine - то он не работает
Какая у Вас версия AutoIt? Если 3.3.10.0+, то для того, чтобы /AutoIt3ExecuteLine работал после компиляции, надо добавить в код
Код:
#pragma compile(AutoItExecuteAllowed, True)
Читайте AutoIt 3.3.10.0 - Финал
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
Спасибо за совет с /AutoIt3ExecuteLine, он теперь заработал, но, пока висит любое окно msgbox - программа не закрывается. Хочется так: компилированный скрипт выполнил некое действие, выдал окно, и закрылся, обеспечив дальнейшую работу родительской программы. Сейчас получается - пока юзер не нажмет OK - родительская программа ждет.

Также попробовал _NotifyBox() - там еще загадочнее - окна закрываются сами, игнорируя timeout.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ildary [?]
пока висит любое окно msgbox - программа не закрывается
Что значит не закрывается? Exit закроет программу, не вижу проблемы.
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
Код:
#pragma compile(AutoItExecuteAllowed, True)

$sCode = "MsgBox(64, '1', '1')"
Run(@AutoItExe&' /AutoIt3ExecuteLine "'&$sCode&'"')


Запускаем программу, всплывает окно с шапкой и текстом 1. Пока его не закроем - скрипт висит в памяти. Добавка в конец Exit - не помогает. Такое ощущение, что Run исполняется как RunWait

Используйте для AutoIt кода тег [autoit]
autoit.gif

madmasles.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ildary [?]
Запускаем программу, всплывает окно с шапкой и текстом 1. Пока его не закроем - скрипт висит в памяти
В памяти (точнее в процессах) висит скрипт который запускается с /AutoIt3ExecuteLine, родительский скрипт не висит.
Какая версия AutoIt?
 
Автор
I

ildary

Новичок
Сообщения
49
Репутация
0
Версия autoit 3.3.12.0. Я скомпилировал скрипт с именем zzzz.exe и запустил - в памяти висит не autoit.exe, а zzzz.exe
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
ildary [?]
Уважаемые специалисты, подскажите пожалуйста, каким образом можно вызвать окно аля MsgBox, которое не будет останавливать выполнение программы
Код:
#Include "NotifyBox.au3"

Opt('TrayAutoPause', 0)

For $i = 1 to 20
   If Not Mod($i, 8) Then
	  _NotifyBox(262144, @ScriptName, StringFormat("ВНИМАНИЕ!!! Цикл выполнен %d раз(а))", $i), 2)
   EndIf
   ConsoleWrite(StringFormat("Работа основного скрипта! (%d)\n",  $i))
   Sleep(1000)
Next
 
Верх