Кто-нибудь знает, как заставить пользователя перезагрузить компьютер после завершения установки? С помощью директивы AlwaysRestart = yes Setup все, что она делает, это предлагает пользователю перезапустить, выбрать между сейчас или позже, но на самом деле он не перезагружается автоматически или показывает только вариант «перезапустить сейчас». Является ли это возможным?

Спасибо.

2
KurayamiArai 3 Дек 2014 в 19:33

2 ответа

Лучший ответ

Нет, это невозможно. Этот is hardcoded и есть нет события, которое могло бы вызвать его изменение (например, путем скрытия переключателя Нет, я перезагружу компьютер позже ).

Но это правильно. Вы никогда не должны выключать систему без разрешения пользователя. Они могут потерять данные, когда вы это сделаете.

3
TLama 3 Дек 2014 в 19:56
Я не хочу перезагружаться без разрешения пользователя. Я просто хочу показать пользователю на странице завершения, что после нажатия кнопки «Готово» установка перезапустится, как и во многих других установках.
 – 
KurayamiArai
3 Дек 2014 в 20:13
1
Извините, но я не понимаю. Если вы установите для AlwaysRestart значение yes, на последней странице появятся два переключателя, где установлен флажок Да, перезагрузить компьютер сейчас, поэтому пользователь может просто нажать Готово, чтобы перезапустить систему. Так что я не вижу здесь никакой проблемы. Однако, если вы спрашиваете, как отобразить диалоговое окно сообщения вместо этих переключателей, даже это невозможно сделать. Такое окно сообщения отображается, но только если вы запускаете установку в автоматическом режиме.
 – 
TLama
3 Дек 2014 в 20:25
Я хочу показать только один переключатель, предупреждая пользователя о необходимости перезагрузки.
 – 
KurayamiArai
3 Дек 2014 в 21:05
Да я вижу. Это случай, который я описал в своем ответе как нет события, которое могло бы сработать, чтобы позволить ему измениться (например, путем скрытия радиокнопки «Нет, я перезапущу компьютер позже»).
 – 
TLama
3 Дек 2014 в 21:07

Вы можете сделать это так:

  [Tasks]
  Name: "RestartPC"; Description: "Restart the Computer"; GroupDescription: "Post Installation Options"; Flags: unchecked;

  [Code]
  function NeedRestart(): Boolean;
  begin
    if IsTaskSelected('RestartPC') then
      Result := False;
  end;

  procedure CurStepChanged(CurStep: TSetupStep);  
  var
  intResultCode: Integer;
  begin
    if CurStep = ssPostInstall then
      if IsTaskSelected('RestartPC') then
        NeedRestart;
    if CurStep = ssDone then
      begin
        if IsTaskSelected('RestartPC') then
          if SuppressibleMsgBox('A restart was selected, or Setup must restart your computer to complete the installation.' + #13#10 + #13#10 +
            'Would you like to restart now?',
            mbConfirmation, MB_YESNO, IDYES) = IDYES then
              Exec('shutdown.exe', '-r -t 0', '', SW_HIDE,
                ewNoWait, intResultCode);
      end;
  end;
1
Robert Wigley 9 Янв 2015 в 19:56
1
Затем вам нужно будет установить какую-то директиву никогда не перезапускать, чтобы программа установки никогда не запрашивала перезапуск. Шаг ssDone is signalled когда последняя страница уже отображается. Но даже если бы это было не так, вам все равно нужно было бы запретить программе установки когда-либо запрашивать перезагрузку, поскольку пользователь может отменить ваш диалог, а когда программе установки потребуется перезагрузка, появится последняя страница с этими переключателями (так что пользователь просят дважды об одном и том же).
 – 
TLama
4 Дек 2014 в 12:58
Необходимо проверить, но нельзя ли использовать if IsTaskSelected('RestartPC') then NeedResart := False на каком-то более раннем этапе установки (до ssDone), чтобы предотвратить появление переключателей?
 – 
Robert Wigley
9 Янв 2015 в 14:27
Я полагаю, вы хотите вернуть False из события PrepareToInstall. Ну, это событие для вас, чтобы дополнительно запросить перезагрузку. Inno Setup обрабатывает свои собственные запросы на перезагрузку, когда они необходимы, поэтому это не помешает Inno Setup запрашивать перезагрузку при необходимости.
 – 
TLama
9 Янв 2015 в 15:12
На самом деле я больше думал о if CurStep = ssPostInstall в том же procedure CurStepChanged
 – 
Robert Wigley
9 Янв 2015 в 15:30
Код обновлен для предотвращения двойного запроса на перезапуск. Кажется, это работает. Это можно изменить, чтобы всегда принудительно перезапускать, скрыв Задание, удалив флажок «Непроверенный» и изменив окно сообщения на неподавляемый MB_OK, просто предупреждая, что компьютер перезагрузится. @TLama Вы видите какие-либо проблемы с этим?
 – 
Robert Wigley
9 Янв 2015 в 16:29