Following on from Inno Setup remove or edit Installing Application Name display on shut down. Is there a way to tell Inno Setup not to block on shut down and allow Windows to close the Installer normally? Ideally this would be implemented for all screens until the Install button is pressed, then blocking enabled again whilst installing, then disabled again when complete and at the Finish screen (i.e. only block whilst making changes). Is this possible and how might it be attempted?
Asked
Active
Viewed 319 times
1 Answers
2
Inno Setup explicitly rejects WM_QUERYENDSESSION
messages. You cannot do anything about it, without modifying Inno Setup source code.
See the TDummyClass.AntiShutdownHook
method:
class function TDummyClass.AntiShutdownHook(var Message: TMessage): Boolean;
begin
{ This causes Setup/Uninstall/RegSvr to all deny shutdown attempts.
- If we were to return 1, Windows will send us a WM_ENDSESSION message and
TApplication.WndProc will call Halt in response. This is no good because
it would cause an unclean shutdown of Setup, and it would also prevent
the right exit code from being returned.
Even if TApplication.WndProc didn't call Halt, it is my understanding
that Windows could kill us off after sending us the WM_ENDSESSION message
(see the Remarks section of the WM_ENDSESSION docs).
- SetupLdr denys shutdown attempts as well, so there is little point in
Setup trying to handle them. (Depending on the version of Windows, we
may never even get a WM_QUERYENDSESSION message because of that.)
Note: TSetupForm also has a WM_QUERYENDSESSION handler of its own to
prevent CloseQuery from being called. }
Result := False;
case Message.Msg of
WM_QUERYENDSESSION: begin
{ Return zero, except if RestartInitiatedByThisProcess is set
(which means we called RestartComputer previously) }
if RestartInitiatedByThisProcess or (IsUninstaller and AllowUninstallerShutdown) then begin
AcceptedQueryEndSessionInProgress := True;
Message.Result := 1
end else
Message.Result := 0;
Result := True;
end;
{ ... }
and the TSetupForm.WMQueryEndSession
method:
procedure TSetupForm.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
{ TDummyClass.AntiShutdownHook in Setup.dpr already denies shutdown attempts
but we also need to catch WM_QUERYENDSESSION here to suppress the VCL's
default handling which calls CloseQuery. We do not want to let TMainForm &
TNewDiskForm display any 'Exit Setup?' message boxes since we're already
denying shutdown attempts, and also we can't allow them to potentially be
displayed on top of another dialog box that's already displayed. }
{ Return zero, except if RestartInitiatedByThisProcess is set (which means
we called RestartComputer previously) }
if RestartInitiatedByThisProcess then
Message.Result := 1;
end;

Martin Prikryl
- 188,800
- 56
- 490
- 992
-
Thanks Martin. A pity it's not possible without modifying the source code. – Robert Wigley Dec 28 '16 at 15:52