方案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;