Вопрос Автоматическое нажатие на кнопку "Завершить"

Timick

Старожил
Всем привет! Появился небольшой вопросик) Можно ли сделать автоматическое нажатие на кнопку "Завершить". Нужно это, для корректного завершения работы инсталла и последующего выключения ПК. Вот код:

Код:
wpFinished:
   if BtnGetChecked(OFFPC) and not Error then begin
      ExecAndWait(ExpandConstant('{tmp}\OFFPC.cmd'), '', '', SW_HIDE, True);  
      SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0);
      SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0);  
   end;
То есть, если выбран чекбокс и нет ошибок инсталл должен запустить батник и закрыть инсталл. Батник то он запускает, а вот закрываться не хочет. Может кто знает в чем проблема? Заранее спасибо)
 

Nemko

Дилетант
Модератор
Вот пример вроде работает.

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DisableWelcomepage=True
DisableReadyPage=True

[Files]
Source: 1.exe; DestDir: {app};

[Code]
var
  Check: TCheckBox;

function CheckCheckBox: Boolean;
  begin
    Result:=Check.Checked;
end;

procedure InitializeWizard;
begin
    Check:=TCheckBox.Create(WizardForm);
    with Check do begin
    Parent:=WizardForm.SelectDirPage;
    SetBounds(5, 160, 190, 15);
    Caption:='Запустить что-то и закрыть.';
    Color:=clSilver;
    Checked:=False;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
    ErrorCode: Integer;

  begin case CurPageID of
    wpFinished:
    if (Check.Checked) then begin
    Exec(ExpandConstant('{app}\1.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
    SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0);
    SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0);
end;
end;
end;
 

Вложения

Последнее редактирование:

Timick

Старожил
Да, действительно работает. Вот только в моём инсталле не работает по-прежнему. Странно, может это связано с тем, что кнопки на ботве? Любопытно. Может есть у кого идеи?
 

Nemko

Дилетант
Модератор
Скорее дело в другом. Так как здесь эмитируется нажатие на стандартную кнопку WizardForm.Nextbutton, может она убрана из скрипта или что-то ещё...
 
Последнее редактирование:

Timick

Старожил
Nemko, Да вроде нет)
Код:
  with WizardForm.NextButton do begin
    BtnSetText(hNextBtn, PAnsiChar(Caption));
    BtnSetVisibility(hNextBtn,Visible);
    BtnSetEnabled(hNextBtn,Enabled);
    BtnRefresh(hNextBtn);
  end;
 

Nemko

Дилетант
Модератор
Решение есть (или нет):
  • Cделать свои кнопки на botva (со своим ID)
  • Скрыть стандартные (Пример: WizardForm.NextButton.SetBounds(0, 0, 0, 0))
  • Через оператор выбора Case of создать процедуру для имитации нажатия на стандартную кнопку
  • Пример
    procedure ButtonOnClick(hBtn:HWND);
    begin
    case hBtn of
    NextBtn: WizardForm.NextButton;
    CancelButton: WizardForm.Close;
    end;
    end;
  • И вроде должно сработать в теории :pardon:
 

Timick

Старожил
Nemko, Спасибо, конечно, но такие костыли, ну нафиг. Пусть лучше винда сама его закрывает. Уж ничего тут не будет такого)) В любом случае - спасибо! :)
 

Shegorat

Lord of Madness
Администратор
Timick
Всё гораздо проще. Вы используете функцию ExecAndWait, которая ожидает завершения запущенного процесса, в данном случае батника.
Код:
ExecAndWait(ExpandConstant('{tmp}\OFFPC.cmd'), '', '', SW_HIDE, True);
Просто используйте функцию Exec из примера выше с параметром ewNoWait.
 

Timick

Старожил
Shegorat, Да ну всё равно не работает) Батник запускает и всё. А инсталл не закрывается.
Код:
Exec(ExpandConstant('{tmp}\OFFPC.cmd'), '', ExpandConstant('{tmp}'), SW_Hide, ewNoWait, R);
 

Timick

Старожил
А может есть пример у кого? Видел подобное в инсталле от мехов. Я то хочу что сделать: на странице установки есть чекбокс и если пользователь выбирает его, то после установки компьютер автоматически выключается. Всё бы ничего, да вот только если его перед этим не закрыть, в Temp директории остаются остаточные файлы, что ни есть хорошо. Можно, конечно, закрыть инсталл через CMD, а затем удалить файлы из Temp, но это тоже костыль своеобразный. А тут всего лишь на кнопку нажать. Да вот только что-то не хочет она нажиматься :$
 
Сверху