Один из способов заставить Innosetup «не выглядеть замороженным» - добавить «фальшивый» индикатор прогресса, например, выделение, чтобы показать, что что-то происходит. Но это не решит проблему «окно не перетаскивается / перемещается».
Итак, еще один способ - разморозить графический интерфейс Innosetup, пока выполняется длительный процесс:
«Длительный процесс» выполняется через ShellExecuteEx ().
Затем установщик использует цикл while с условием
WaitForSingleObject
и очень минимальное время ожидания
выполнить AppProcessMessage
.
AppProcessMessage
сама по себе является вспомогательной функцией. Он использует «общий» код для воссоздания процедуры «Application.ProcessMessages» -ish, используя функции WinAPI PeekMessage()
, TranslateMessage()
и DispatchMessage()
.
Его работа заключается в том, чтобы доставлять сообщения в графический интерфейс InnoSetup.
Этот трюк делает окно отзывчивым / перетаскиваемым снова,
в то время как "длительный процесс" обрабатывается в фоновом режиме.
Это источник для цикла выполнения:
if ShellExecuteEx(ExecInfo) then
begin
while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT
do begin
AppProcessMessage;
WizardForm.Refresh();
end;
CloseHandle(ExecInfo.hProcess);
end;
Следующая GIST для unzip.iss
содержит код для автономного Unzip Helper для выполнения 7zip без блокировки InnoSetup GUI , включая биты и кусочки для работы с AppProcessMessage
функцией.
В этом случае «unzip» - это просто пример, и вы можете заменить исполняемое приложение на что угодно, установщик .Net или любую другую долгосрочную задачу.