Since ProgressGauge
has no progress change events and there is no way to process installation application messages, you will need to use the Windows Timer API. This timer needs a callback function that you cannot define in the Inno Setup script, unfortunately, for this you will need an external library to perform this task. However, there is an InnoCallback
library that can do just that.
For the following code, copy the InnoCallback.dll
library into your installation directory, merge this code using the Inno Setup script and execute some page of the slide show into the OnSlideTimer
event, which will be called periodically (with the current settings every second).
[Files] Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy [code] var TimerID: Integer; type TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; SysTime: DWORD); function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; external ' wrapcallback@files :InnoCallback.dll stdcall'; function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: UINT): UINT; external ' SetTimer@user32.dll stdcall'; function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; external ' KillTimer@user32.dll stdcall'; procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; SysTime: DWORD); begin { here you can turn your slideshow pages; use some variable to store the } { current index of the slide you are on, note that this procedure is called } { periodically each 1000 ms (see below why), so here you can also check the } { progress value, if you want to } end; procedure StartSlideTimer; var TimerCallback: LongWord; begin TimerCallback := WrapTimerProc(@OnSlideTimer, 4); { third parameter here is the timer timeout value in milliseconds } TimerID := SetTimer(0, 0, 1000, TimerCallback); end; procedure KillSlideTimer; begin if TimerID <> 0 then begin if KillTimer(0, TimerID) then TimerID := 0; end; end; function InitializeSetup: Boolean; begin Result := True; TimerID := 0; end; procedure DeinitializeSetup; begin KillSlideTimer; end; procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = wpInstalling then StartSlideTimer else KillSlideTimer; end;
TLama source share