4

我想杀死一个使用inno setup.i的进程,我想在我开始安装安装程序之前检查窗口是否打开。如何使用inno setup来结束进程?

我可以通过搜索窗口名称吗? 请帮我用一些示例代码来终止进程

+0

也许一个简单的互斥解决方案就足够了?在您的应用程序中添加一个互斥锁,然后使用'Setup'部分中的'AppMutex'参数。 –

回答

1

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

还有其他选项,如Files in use extensionPSVince

也看到this article一个位的更多信息。

+0

begin Wnd:= FindWindowByWindowName('name');如果Wnd <> 0,则SendMessage(Wnd,WM_CLOSE,0,0); 结果:=真;。我试过像这样。它工作正常,但我想关闭托盘window.how退出此窗口 – Nithin

+1

[UninstallRun] Filename:{cmd};参数:/ c taskkill/f/im notepad.exe;标志:runhidden.can我喜欢这样吗? – Nithin

+0

不要直接杀死它,因为它可能会导致问题。使用隐藏窗口和FindWindow方法通知它关闭。 – Deanna

5

这是我做的事情,以提示用户关闭程序,如果它被发现运行。

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; 
+0

它的意思是。总是要求用户很好地关闭应用程序。 – thomiel

+0

喜欢这个;除当前版本的InitializeGlobals外;打破它。 – Will

15
在[UninstallRun]部分

,可以添加以下代码:

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

一种不太复杂方法将运行一个batch file它使用任务杀死

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

taskkill /IM notepad.exe