Что нового

_NotifyBox() - MsgBox() без приостановки скрипта

Yashied

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

Категория: Окна и диалоги

Описание: Библиотека содержит всего одну функцию _NotifyBox(), которая аналогична MsgBox(), с той лишь разницей, что запускается в отдельном потоке и соответственно не влияет (не приостанавливает) на работу скрипта. Параметры идентичны функции MsgBox(). Если предполагается переодически вызывать _NotifyBox(), то я рекомендую указывать время (в секундах), по истечении которого окно уведомления будет автоматически закрыто (параметр $iTimeOut). В противном случае, очень скоро ваш рабочий стол будет усеян этими окнами.

:smile:

Пример:
Код:
#Include "NotifyBox.au3"

Opt('TrayAutoPause', 0)

While 1
	_NotifyBox(16, ':-(', 'One.', 2)
	Sleep(500)
	_NotifyBox(48, ':-|', 'Two.', 2)
	Sleep(500)
	_NotifyBox(64, ':-)', 'Three.', 2)
	Sleep(3000)
WEnd

Скриншот:

NotifyBox.png

Источник: NotifyBox UDF (оффициальный форум)
Автор: Yashied
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

Yashied
IMHO для полного счастья, нужен ещё один параметр, TimeOut :smile:
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

Точно. И так смысла в этом я не вижу :whistle:
Зачем нам такое уведомление? Просветите мну на предмет практического использования :-[
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

axlwor сказал(а):
Зачем нам такое уведомление? Просветите мну на предмет практического использования.

Здесь
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

axlwor [?]
Зачем нам такое уведомление?
Простой MsgBox вызовет остановку скрипта, _NotifyBox не делает этого. Yashied указал вам тему, где решалась такая задача.
Вот простой пример показывающий работу _NotifyBox
Код:
$iTime = TimerInit()
While Eval("i") < 10000000
	For $i = 0 To 10000000
		If Mod($i,1000000) = 0 Then
			_NotifyBox(64, @ScriptName, "Пройдено  " & $i & " циклов за " & Round(TimerDiff($iTime) / 1000, 2) & " сек.")
		EndIf
	Next
    Sleep(100)
WEnd


P.S. Не забываем про _NotifyBox()
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

Garrett сказал(а):
...для полного счастья, нужен ещё один параметр, TimeOut.

OK. См. первый пост.

:smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: _NotifyBox() - MsgBox() без приостановки скрипта.

Yashied
:ok:
Спасибо!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied
Если это UDF, то наверное следует переместить тему в подобающий раздел? и заодно оформить по правилам.
 
Автор
Yashied

Yashied

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

Ну началось все с небольшой функции...
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Теперь можно поставить свою иконку, флаг (MB_USERICON = 0x80).

Код:
#Include <NotifyBox.au3>
#Include <WinAPI.au3>

_NotifyBox(0x80, 'Notify', 'Message box with a custom icon.', 0, 0, _WinAPI_GetModuleHandle('shell32.dll'), 239)

Sleep(3000)


post_img_052.png
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied, может лучше спрятать WinAPI.au3 и _WinAPI_GetModuleHandle() внутрь NotifyBox.au3?
IMHO вот так будет эстетичнее.
Код:
_NotifyBox(128, 'Notify', 'Message box with a custom icon.', 0, 0, 'shell32.dll', 239)

Что скажите?
 
Автор
Yashied

Yashied

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

Функция MessageBoxIndirect() воспринимает не индекс иконки в файле, а номер (название) ресурса в .exe или .dll. И дабы не вводить никого в заблуждение, я оставил на входе HINSTANCE, поскольку .ico файлы все равно нельзя указывать. В данном примере, 239 - это название ресурса иконки в shell32.dll, а ее индекс - 130.

Кстати, _NotifyBox() возвращает хендл message box'а, и как следствие, можно делать с этим окном все, что угодно:

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

$hIcon = _WinAPI_ShellExtractIcon('C:\Program Files\AutoIt3\Icons\au3.ico', 0, 32, 32)
$hWnd = _NotifyBox(0x80, 'Notify', 'Message box with a custom icon and disabled button.')
_SendMessage(ControlGetHandle($hWnd, '', '[CLASSNN:Static1]'), 0x0172, 1, $hIcon)
ControlDisable($hWnd, '', '[CLASSNN:Button1]')
ControlSetText($hWnd, '', '[CLASSNN:Button1]', 'Упс!')
ControlFocus ($hWnd, '', '[CLASSNN:Static1]')
Sleep(5000)
_WinAPI_Destroyicon($hIcon)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку. Теперь вы можете получать результат, возвращаемый функцией MessageBoxIndirect() (код нажатой кнопки). См. второй пример.
 
Автор
Yashied

Yashied

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

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
В таком виде, с флагом 262144 для вывода на передний план
Код:
_NotifyBox(262144, 'Заголовок', 'Текст')

работает как обычный MsgBox, т.е., не работает, скрипт останавливает работу до нажатия "ОК" :(
 

La2Angel

Новичок
Сообщения
156
Репутация
1
А кнопки она поддерживает кроме ок? (Yes, No, Cancel) например ?
 
Верх