10

我有以下几行:

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

我希望我的应用程序在不显示复选框的情况下启动(这将不允许用户这样做)。

有人可以告诉我怎么做吗?谢谢你。

4

2 回答 2

18

我能想到的选择很少。第一个是从[Code]脚本的部分运行您的应用程序,第二个是禁用该部分条目的复选框,[Run]第三个是隐藏RunList.

1. 向导完成后如何手动运行应用程序?

我个人更喜欢这种方式,因为它比添加复选框并稍后隐藏它更简单。您将删除当前部分条目,并在其参数等于时从事件方法[Run]调用以下函数之一,这表示完成按钮单击:NextButtonClickCurPageIDwpFinished

  • Exec- 使用与安装/卸载相同的凭据执行指定的可执行文件或批处理文件。
  • ExecAsOriginalUser- 使用最初启动安装程序的用户的(通常未提升的)凭据执行指定的可执行文件或批处理文件
  • ShellExec- 使用与安装/卸载相同的凭据打开指定的文件或执行 Verb 指定的其他操作。
  • ShellExecAsOriginalUser- 使用最初启动安装程序的用户的(通常非提升的)凭据打开指定的文件或执行 Verb 指定的其他操作。

因为您没有使用runascurrentusernorshellexec标志,所以安装程序在内部调用了一个类似于以下的函数:

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  if CurPageID = wpFinished then
    ExecAsOriginalUser(ExpandConstant('{app}\MyApp.exe'), '', '', 
      SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

此解决方案的一个弱点是即使安装程序请求重新启动,程序也会被执行。要解决确定此请求的缺失可能性,我们可以检查是否YesRadio可见(是,立即重新启动计算机单选按钮)并选中,这意味着要求用户重新启动计算机并确认它。这是考虑重新启动请求的版本:

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  // if the "Finish" button was clicked and "Yes, restart the computer now"
  // radio button was either not visible or not selected that time, then...
  if (CurPageID = wpFinished) and ((not WizardForm.YesRadio.Visible) or 
    (not WizardForm.YesRadio.Checked))
  then
    ExecAsOriginalUser(ExpandConstant('{app}\MyApp.exe'), '', '', 
      SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

2. 如何禁用最后一页的安装后复选框?

另一种选择是禁用该复选框。用户将看到应用程序将被执行,但无法对其执行任何操作(当然,除了从任务管理器中终止设置)。这次您将保留您的[Run]部分条目,但修改RunList来自[Code]部分:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

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

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
  // you must do this as late as possible, because the RunList is being modified
  // after installation; so this will check if there's at least one item in the
  // RunList and then set to the first item (indexing starts at 0) Enabled state
  // to False
  if (CurPageID = wpFinished) and (WizardForm.RunList.Items.Count > 0) then
    WizardForm.RunList.ItemEnabled[0] := False;
end;

3. 如何完全隐藏 RunList ?

与第二个选项相反,这将按照您的要求进行。它将保持复选框隐藏,或者更准确地说,它将隐藏整个,因此如果您在指定标志的部分RunList中有多个条目,它也不会被看到:[Run]postinstall

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

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

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then
    WizardForm.RunList.Visible := False;
end;
于 2013-09-22T09:56:09.187 回答
1

适用于版本 5.5.7

如果要自动打开网站,请添加以下代码

[Code]
procedure CurPageChanged(CurPageID: Integer);
var
  ErrorCode : Integer ;
begin
  if CurPageID = wpFinished then
    ShellExecAsOriginalUser('', ExpandConstant('http:\\www.google.pt'), '', '',SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
于 2016-01-09T17:05:41.107 回答