如何使用 inno setup 结束进程?

Posted

技术标签:

【中文标题】如何使用 inno setup 结束进程?【英文标题】:How to end a process using inno setup? 【发布时间】:2011-12-16 13:00:50 【问题描述】:

我想使用 inno setup 杀死一个进程。我想在开始安装设置之前检查窗口是否打开。

我可以通过搜索窗口名称来做到这一点吗? 请帮我提供一些示例代码来终止进程

【问题讨论】:

也许一个简单的互斥体解决方案就足够了?向您的应用程序添加一个互斥体,然后在Setup 部分中使用AppMutex 参数。 【参考方案1】:

在 [UninstallRun] 部分,您可以添加以下代码:

Filename: sys\taskkill.exe; Parameters: "/f /im MyProcess.exe"; Flags: skipifdoesntexist runhidden

【讨论】:

为什么要 [UninstallRun]? OP 想在运行设置之前终止该进程。卸载程序运行时不调用[UninstallRun]吗?【参考方案2】:

这是为了提示用户在发现程序正在运行时关闭它。

function CheckProcessRunning( aProcName,
                              aProcDesc: string ): boolean;
var
  ShellResult: boolean;
  ResultCode: integer;
  cmd: string;
  sl: TStringList;
  f: string;
  d: string;
begin
  cmd := 'for /f "delims=," %%i ' + 
         'in (''tasklist /FI "IMAGENAME eq ' + aProcName + '" /FO CSV'') ' + 
         'do if "%%~i"=="' + aProcName + '" exit 1'; 
  f := 'CheckProc.cmd';
  d := AddBackSlash( ExpandConstant( 'tmp' ));
  sl := TStringList.Create;
  sl.Add( cmd );
  sl.Add( 'exit /0' );
  sl.SaveToFile( d + f );
  sl.Free;
  Result := true;
  while ( Result ) do
  begin
    ResultCode := 1;
    ShellResult := Exec( f,
                         '',
                         d, 
                         SW_HIDE, 
                         ewWaitUntilTerminated, 
                         ResultCode );
    Result := ResultCode > 0;
    if Result and 
       ( MsgBox( aProcDesc + ' is running. This program must be closed to continue.'#13#10 + 
                 'Please close it and click Yes to retry or click No to cancel this installer.', 
                 mbConfirmation, 
                 MB_YESNO ) <> IDYES ) then
      Break;
  end;
  DeleteFile( d + f );
end;

我在以下特殊代码段中使用了它:

// Perform some initializations.  Return False to abort setup
function InitializeSetup: Boolean;
begin
  // Do not use any user defined vars in here such as app
  InitializeGlobals;
  Result := not ( CheckProcessRunning( 'bcb.exe',      'C++ Builder' ) or
                  CheckProcessRunning( 'delphi32.exe', 'Delphi'      ) or
                  CheckProcessRunning( 'bds.exe',      'Rad Studio'  ));
end;


function InitializeUninstall: Boolean;
begin
  InitializeGlobals;
  Result := not ( CheckProcessRunning( 'bcb.exe',      'C++ Builder' ) or
                  CheckProcessRunning( 'delphi32.exe', 'Delphi'      ) or
                  CheckProcessRunning( 'bds.exe',      'Rad Studio'  ));
end;

【讨论】:

本应如此。始终友好地要求用户关闭应用程序。 喜欢这个;当前版本 InitializeGlobals 除外;打破它。【参考方案3】:

最好的选择是使用互斥体来查看它是否仍在使用AppMutex 运行。关闭它的一种方法是找到窗口句柄,然后发布一个简单的 WM_CLOSE 消息。

还有其他选项,例如 Files in use extension 和 PSVince

有关更多信息,另请参阅this article。

【讨论】:

开始 Wnd := FindWindowByWindowName('name');如果 Wnd 0 则 SendMessage(Wnd, WM_CLOSE, 0, 0);结果:=真;。我试过这样。它工作正常,但我想关闭托盘窗口。如何退出这个窗口 [UninstallRun] 文件名:cmd;参数:/c taskkill /f /im notepad.exe;标志:runhidden.can i do like this? 不要直接杀死它,因为它会导致问题。使用隐藏窗口和 FindWindow 方法通知它关闭。【参考方案4】:

一个不太复杂的方法是运行一个使用任务终止的batch file

ie:如果你想在卸载前杀死记事本

taskkill /IM notepad.exe

【讨论】:

以上是关于如何使用 inno setup 结束进程?的主要内容,如果未能解决你的问题,请参考以下文章

在 Inno Setup 中使用“taskkill /f /im”在(重新)安装之前终止进程

当文件在另一个进程中打开时,Inno Setup LoadStringFromFile 失败

inno setup静默安装的问题

在安装更新之前关闭程序的运行版本(Inno Setup)

Linux 下如何结束指定进程

inno setup打包软件学习