关闭应用程序的实例但不是当前实例

del*_*les 0 delphi winapi delphi-2007

我想只允许我的应用程序的一个实例运行.我正在使用下面的代码关闭我的应用程序的其他实例,但问题是它也会终止当前会话.如何编辑此代码以关闭其他实例,但不能编辑当前实例?

function killDuplicates: integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
pna : string;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while Integer(ContinueLoop) <> 0 do
    begin
    pna := lowercase(ExtractFileName(FProcessEntry32.szExeFile));
    if pna = 'myapp.exe' then
      Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
CloseHandle(FSnapshotHandle);
end;
Run Code Online (Sandbox Code Playgroud)

kob*_*bik 8

回答问题:

如何编辑此代码以关闭其他实例,但不能编辑当前实例?

比较FProcessEntry32.th32ProcessIDGetCurrentProcessId.如果它们匹配,那就是你当前的过程.

也就是说,我强烈建议您不要使用这种方法来创建单个实例应用程序,正如@Jerry已经提到的那样.
考虑一下:您的程序正在运行,用户已经与它进行了交互.现在用户启动第二个实例.你认为会发生什么?已经运行的应用程序将被第二个实例逐字删除.相反,如果第二个实例找到已经运行的实例(可选地通知正在运行的进程,那么它可以将自己带到前面),让第二个实例优雅地终止自身.

看看这里可能的解决方案: