Inno设置:运行程序而不显示复选框

tmi*_*hty 8 inno-setup

我有以下几行:

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序开始时不显示复选框(这将禁止用户这样做).

有人可以告诉我怎么样吗?谢谢.

TLa*_*ama 13

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

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

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

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

因为你没有使用runascurrentusernor shellexec标志,所以setup在内部调用类似于这样的函数:

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;
Run Code Online (Sandbox Code Playgroud)

该解决方案的一个缺点是即使设置请求重启也会执行程序.为了解决缺少确定此请求的可能性,我们可以检查是否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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)