方案1:窗口名稱判斷FindWindowByWindowName
原理:通過檢查窗口名稱來判斷程序是否運行
說明:如果文件夾名稱也叫這個,也會認爲是程序,造成錯誤判斷。
;RUN msg
#define RUNNINGMSG_CH " 正在運行,請先退出!"
#define RUNNINGMSG_EN " is running,please quit first!"
【code】
// 獲取警告信息
function GetRunningNotice(Param: String):String;
var
lan:String;
appName:String;
begin
lan := ActiveLanguage();
appName := '{#appname}';
if (lan = 'English') then
Result := appName + '{#RUNNINGMSG_EN}'
else
Result := appName + '{#RUNNINGMSG_CH}';
end;
// 安裝時判斷客戶端是否正在運行
function InitializeSetup(): Boolean;
var
IsRunning: Integer;
name:String;
notice:String;
begin
Result :=true; //安裝程序繼續
name := '程序標題';
IsRunning:=FindWindowByWindowName(name);
if IsRunning <> 0 then
begin
notice := GetRunningNotice('');
Msgbox(notice, mbConfirmation, MB_OK);
Result :=false; //安裝程序退出
end;
end;
// 卸載時判斷客戶端是否正在運行
function InitializeUninstall(): Boolean;
var
IsRunning: Integer;
name:String;
notice:String;
begin
Result :=true; //安裝程序繼續
name := '程序標題';
IsRunning:=FindWindowByWindowName(name);
if IsRunning <> 0 then
begin
notice := GetRunningNotice('');
Msgbox(notice, mbConfirmation, MB_OK);
Result :=false; //安裝程序退出
end;
方案2:通過庫psvince.dll的IsModuleLoaded接口來判斷程序進程(名稱)是否在運行
說明:只能判斷,不能結束進程,需要將psvince.dll拷貝到inno setup安裝目錄下,還需要拷貝到要打包程序的同級目錄下
[Files]
Source: compiler:psvince.dll; Flags: dontcopy noencryption
// 安裝時判斷客戶端是否正在運行
function IsModuleLoaded(modulename: String ): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
function InitializeSetup(): Boolean;
var
IsRunning: boolean;
name:String;
notice:String;
begin
Result :=true; //安裝程序繼續
name := '程序.exe';
IsRunning:= IsModuleLoaded(name);
if IsRunning then
begin
notice := GetRunningNotice('');
Msgbox(notice, mbConfirmation, MB_OK);
Result :=false; //安裝程序退出
end;
end;
// 安裝時判斷客戶端是否正在運行
function IsModuleLoadedU(modulename: String ): Boolean;
external 'IsModuleLoaded@{app}/psvince.dll stdcall uninstallonly';
function InitializeSetup(): Boolean;
var
IsRunning: boolean;
name:String;
notice:String;
begin
Result :=true; //安裝程序繼續
name := ''程序.exe';
IsRunning:= IsModuleLoaded(name);
if IsRunning then
begin
notice := GetRunningNotice('');
Msgbox(notice, mbConfirmation, MB_OK);
Result :=false; //安裝程序退出
end;
UnloadDll(ExpandConstant('{app}/psvince.dll'));// 必須要釋放,否則卸載不乾淨
end;
方案3:通過庫IsTask.dll的RunTask接口來判斷程序進程(名稱)是否在運行,使用接口KillTask結束進程
說明:不但能判斷,還能結束進程,需要將ISTask.dll拷貝到inno setup安裝目錄下,還需要拷貝到要打包程序的同級目錄下
;RUN msg
#define RUNNINGMSG_CH " 正在運行,點擊‘是’按鈕退出程序繼續安裝,點擊‘否’按鈕停止安裝!"
#define RUNNINGMSG_EN " is running,click ‘Yes’ to continue install and click ‘No’ to stop install!"
[Files]
Source: compiler:ISTask.dll; Flags: dontcopy noencryption
// 安裝時判斷客戶端是否正在運行
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
function InitializeSetup(): Boolean;
var
name:String;
notice:String;
begin
Result:= true;
name := ''程序.exe';
if RunTask(name, false) then
begin
notice := GetRunningNotice('');
if MsgBox(notice, mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask(name);
end
else
Result:= false;
end
end;
// 卸載時判斷客戶端是否正在運行
function RunTaskU(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}/ISTask.dll stdcall delayload uninstallonly';
function KillTaskU(ExeFileName: string): Integer;
external 'KillTask@{app}/ISTask.dll stdcall delayload uninstallonly';
function InitializeUninstall(): Boolean;
var
name:String;
notice:String;
begin
Result:= true;
name := ''程序.exe';
if RunTaskU(name, false) then
begin
notice := GetRunningNotice('');
if MsgBox(notice, mbConfirmation, MB_YESNO) = IDYES then
begin
KillTaskU(name);
end
else
Result:= false;
end
UnloadDll(ExpandConstant('{app}/ISTask.dll'));// 必須要釋放,否則卸載不乾淨
end;