Таймер обратного отсчёта на кнопке MessageBox_а
Как то эту задачу уже решали с помощью специальной DLL, что не удобно и лишено гибкости управления...
Но есть и другой способ, с помощью nsWindows плагина (
http://sourceforge.net/p/ifififi/code/HEAD/tree/ ) :
Код:
!include "nsWindows.nsh"
;!include "LogicLib.nsh"
!define TimerMsgTitle "Заголовок сообщения"
Name "TimerMsgBox Example"
OutFile "TimerMsgBox.exe"
Var WINDOW
Var Time
!macro MessageBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0) i.s"
Pop ${out}
!macroend
Section
StrCpy $Time 7
${NSW_CreateWindow} $WINDOW "Timer" 1018
${NSW_CreateTimer} OnTimer 1000
!insertmacro MessageBox $0 "Какое то действие через :" "${TimerMsgTitle}" 0x40|0x1
;MessageBox MB_OK "Return Code: $0"
${If} $0 != 1
MessageBox MB_OK " Действие отменяется ! Выход."
Quit
${EndIf}
MessageBox MB_OK " Начинаем какое то действие"
SectionEnd
Function OnTimer
${If} $Time == 0
FindWindow $0 "#32770" "${TimerMsgTitle}"
GetDlgItem $1 $0 1
SendMessage $1 ${BM_CLICK} 0 0
${NSW_KillTimer} OnTimer
${Else}
IntOp $Time $Time - 1
FindWindow $0 "#32770" "${TimerMsgTitle}"
GetDlgItem $2 $0 1
SendMessage $2 ${WM_SETTEXT} 0 "STR: OK $Time sec"
;GetDlgItem $3 $0 65535
;SendMessage $3 ${WM_SETTEXT} 0 "STR:Осталось: $Time sec"
${EndIf}
FunctionEnd
Всё работает как надо, но есть пара не понятных моментов - во-первых после компиляции получаем сообщение :
!warning: Note: nsWindows.dll must be put in NSIS's Plugins Directory! (macro:_NSW_CreateWindow:17)
Хотя nsWindows.dll находится там где и положено !
во-вторых, зачем то создаётся файл в
\NSIS\Plugins\nsWindows.tmp\nsWindows$insWindows.dll
и потом не удаляется...
Всё это дело исходит из
nsWindows.nsh. Я пробовал три разных вариации nsWindows.nsh, но со всеми эффект одинаков.
(редактировать nsWindows.nsh я не решился...)
Что бы это значило и как это можно устранить ?