如何使用 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”在(重新)安装之前终止进程