Что нового

Обратный таймер на кнопке ОК

NONer

Новичок
Сообщения
27
Репутация
0
Здравствуйте.
Есть ли возможность отображать обратный отсчет прямо на кнопке "ОК" в вопросительном сообщении в виде "ОК (10)", и при нажатии на кнопку выполнить действие?
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
Самопальный Msgbox не работает, выдает множество ошибок (во вложении). Видимо это для старой версии AutoIt.


Добавлено:
Сообщение автоматически объединено:

Skif_off сказал(а):
Это обычное сообщение с таймером, мне известно и пока я пользуюсь таким решением. Вот только я хочу именно таймер на кнопке "ОК".
 

Вложения

  • Error_001.png
    Error_001.png
    73.5 КБ · Просмотры: 28

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
NONer [?]
Самопальный Msgbox не работает
Это кто вам такое сказал.
Меняем в файле MsgBox.au3 секцию #Region Global Variables на то, что ниже и будет вам счастье.
Код:
#Region Global Variables

;~ Global Const $MB_ABORTRETRYIGNORE = 0x2
;~ Global Const $MB_APPLMODAL = 0x0
;~ Global Const $MB_CANCELTRYCONTINUE = 0x6
;~ Global Const $MB_COMPOSITE = 0x2
;~ Global Const $MB_DEFAULT_DESKTOP_ONLY = 0x20000
;~ Global Const $MB_DEFBUTTON1 = 0x0
;~ Global Const $MB_DEFBUTTON2 = 0x100
;~ Global Const $MB_DEFBUTTON3 = 0x200
;~ Global Const $MB_DEFBUTTON4 = 0x300
Global Const $MB_DEFMASK = 0xF00
Global Const $MB_ERR_INVALID_CHARS = 0x8
Global Const $MB_FUNC = 0x4000
;~ Global Const $MB_HELP = 0x4000
;~ Global Const $MB_ICONASTERISK = 0x40
;~ Global Const $MB_ICONERROR = $MB_ICONHAND
;~ Global Const $MB_ICONEXCLAMATION = 0x30
;~ Global Const $MB_ICONHAND = 0x10
;~ Global Const $MB_ICONINFORMATION = $MB_ICONASTERISK
Global Const $MB_ICONMASK = 0xF0
;~ Global Const $MB_ICONQUESTION = 0x20
;~ Global Const $MB_ICONSTOP = $MB_ICONHAND
;~ Global Const $MB_ICONWARNING = $MB_ICONEXCLAMATION
Global Const $MB_MISCMASK = 0xC000
Global Const $MB_MODEMASK = 0x3000
Global Const $MB_NOFOCUS = 0x8000
;~ Global Const $MB_OK = 0x0
;~ Global Const $MB_OKCANCEL = 0x1
;~ Global Const $MB_PRECOMPOSED = 0x1
;~ Global Const $MB_RETRYCANCEL = 0x5
;~ Global Const $MB_RIGHT = 0x80000
;~ Global Const $MB_RTLREADING = 0x100000
;~ Global Const $MB_SERVICE_NOTIFICATION = 0x40000
Global Const $MB_SERVICE_NOTIFICATION_NT3X = 0x40000
;~ Global Const $MB_SETFOREGROUND = 0x10000
;~ Global Const $MB_SYSTEMMODAL = 0x1000
;~ Global Const $MB_TASKMODAL = 0x2000
;~ Global Const $MB_TOPMOST = 0x40000
Global Const $MB_TYPEMASK = 0xF
;~ Global Const $MB_USEGLYPHCHARS = 0x4
;~ Global Const $MB_USERICON = 0x80
;~ Global Const $MB_YESNO = 0x4
;~ Global Const $MB_YESNOCANCEL = 0x3

#EndRegion Global Variables
 
A

Alofa

Гость
Skif_off сказал(а):
Оригинально.

NONer сказал(а):
... Вот только я хочу именно таймер на кнопке "ОК".
Код:
#pragma compile(AutoItExecuteAllowed, True)

Local $iWinFlag = 4097
Local $sWinTitle = 'Сообщение'
Local $sWinText = 'Какой-то текст'
Local $iWinTimeout = 20
;Local $hWinHandle =

$isSend = _MsgBoxTimer($iWinFlag, $sWinTitle, $sWinText, $iWinTimeout)

Func _MsgBoxTimer($iFlag, $sTitle, $sText, $iTimeOut = 0, $hWnd = 0)
	Local $sLen, $hFile, $sMBLine, $iRet
	
	If $iTimeOut Then
		$sLen = StringLen($iTimeOut & ')')
		$sMBLine = '#NoTrayIcon' & @CRLF & _
				'Opt("WinWaitDelay", 1)' & @CRLF & _
				'$hWnd = WinWait("[CLASS:#32770;TITLE:' & $sTitle & ']", "", ' & $iTimeOut & ')' & @CRLF & _
				'If Not $hWnd Then Exit' & @CRLF & _
				'$sControlText = ControlGetText($hWnd, "", "Button1")' & @CRLF & _
				'$iTime = ' & $iTimeOut & @CRLF & _
				'ControlSetText($hWnd, "", "Button1", $sControlText & " (" & StringFormat("%-' & $sLen & 's", $iTime & ")"))' & @CRLF & _
				'While $iTime > 0' & @CRLF & _
				'	ControlSetText($hWnd, "", "Button1", $sControlText & " (" & StringFormat("%-' & $sLen & 's", $iTime & ")"))' & @CRLF & _
				'	If Not WinExists($hWnd) Then ExitLoop' & @CRLF & _
				'	Sleep(1000)' & @CRLF & _
				'	$iTime -= 1' & @CRLF & _
				'WEnd'
		$hFile = FileOpen(@TempDir & '\MsgBoxTimer.tmp', 2)
		FileWrite($hFile, $sMBLine)
		FileClose($hFile)
		Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir & '\MsgBoxTimer.tmp"')
	EndIf
	
	$iRet = MsgBox($iFlag, $sTitle, $sText, $iTimeOut, $hWnd)

	While FileExists(@TempDir & '\MsgBoxTimer.tmp')
		FileDelete(@TempDir & '\MsgBoxTimer.tmp')
	WEnd

	Return $iRet
EndFunc   ;==>_MsgBoxTimer
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
Garrett, спасибо, поправил - все работает. Это то, что нужно.
Alofa, ваш скрипт тоже работает, спасибо.
 
Верх