关闭应用实例但不关闭当前实例
Close instances of app but not the current one
我只想允许我的应用程序的一个实例 运行。我正在使用下面的代码关闭我的应用程序的其他实例,但问题是它也会终止当前会话。我如何编辑此代码以关闭其他实例,但不关闭当前实例?
function killDuplicates: integer;
const
PROCESS_TERMINATE = [=10=]01;
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;
回答问题:
How can i edit this code to close additional instances, but not the
current one ?
比较 FProcessEntry32.th32ProcessID
与 GetCurrentProcessId
。
如果匹配,就是你当前的进程。
也就是说,我强烈建议您不要使用这种方法来创建单实例应用程序,@Jerry 已经提到了。
考虑一下:您的程序是 运行 并且用户已经与其进行交互。现在用户启动第二个实例。你认为会发生什么?已经 运行 的应用程序将被第二个实例从字面上杀死。相反,如果第二个实例找到一个已经 运行 的实例,则让第二个实例优雅地终止 自身 (可选地通知 运行 进程,因此它可以将自己带到前面例如)。
在此处查看可能的解决方案:
How to ensure only a single instance of my application runs?
How can I tell if another instance of my program is already running?
我只想允许我的应用程序的一个实例 运行。我正在使用下面的代码关闭我的应用程序的其他实例,但问题是它也会终止当前会话。我如何编辑此代码以关闭其他实例,但不关闭当前实例?
function killDuplicates: integer;
const
PROCESS_TERMINATE = [=10=]01;
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;
回答问题:
How can i edit this code to close additional instances, but not the current one ?
比较 FProcessEntry32.th32ProcessID
与 GetCurrentProcessId
。
如果匹配,就是你当前的进程。
也就是说,我强烈建议您不要使用这种方法来创建单实例应用程序,@Jerry 已经提到了。
考虑一下:您的程序是 运行 并且用户已经与其进行交互。现在用户启动第二个实例。你认为会发生什么?已经 运行 的应用程序将被第二个实例从字面上杀死。相反,如果第二个实例找到一个已经 运行 的实例,则让第二个实例优雅地终止 自身 (可选地通知 运行 进程,因此它可以将自己带到前面例如)。
在此处查看可能的解决方案:
How to ensure only a single instance of my application runs?
How can I tell if another instance of my program is already running?