inno setup.iを使用してプロセスを強制終了したいのですが、セットアップのインストールを開始する前にウィンドウが開いているかどうかを確認します。inno setupを使ってプロセスを終了するには?
Windowsの名前を検索することでこれを行うことはできますか? プロセスを強制終了するためのサンプルコードを教えてください。
inno setup.iを使用してプロセスを強制終了したいのですが、セットアップのインストールを開始する前にウィンドウが開いているかどうかを確認します。inno setupを使ってプロセスを終了するには?
Windowsの名前を検索することでこれを行うことはできますか? プロセスを強制終了するためのサンプルコードを教えてください。
ベストプラクティスは、ムーテックスを使用してまだ実行中であるかどうかを確認することです。AppMutex
。これを閉じる方法の1つは、ウィンドウハンドルを見つけて単純なWM_CLOSEメッセージをポストすることです。
Files in use extensionとPSVince
また少し詳しくthis articleを見るような他のオプションがあります。
begin Wnd:= FindWindowByWindowName( 'name'); Wnd <> 0の場合、SendMessage(Wnd、WM_CLOSE、0、0); 結果:= True;私はthis.itのように試みました。うまくいきましたが、私はこのウィンドウを終了するためにトレイwindow.howを閉じたいです – Nithin
[UninstallRun] ファイル名:{cmd};パラメータ:/ c taskkill/f/im notepad.exe;フラグ:runhidden.canこれは好きですか? – Nithin
問題が発生する可能性があるので、それを完全に殺すだけではありません。隠しウィンドウとFindWindowメソッドを使用してシャットダウンするように通知します。 – Deanna
これは、実行中であることがわかった場合にプログラムを終了するようユーザーに促すためのものです。
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;
私は次のように次のような特別なコードセクションでそれを使用:
Filename: {sys}\taskkill.exe; Parameters: "/f /im MyProcess.exe"; Flags: skipifdoesntexist runhidden
を、次のコードを追加することができます方法は、タスクキルを使用するbatch fileを実行することです
ie:あなたが望むならアンインストールする前にメモ帳を削除するように編集しました
それほど複雑:[UninstallRun]セクションで
// 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;
多分単純なミューテックス解決策で十分でしょうか?あなたのアプリケーションにmutexを追加し、 'Setup'セクションの' AppMutex'パラメータを使います。 –