delphi - 关闭应用实例但不关闭当前实例

标签 delphi winapi delphi-2007

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

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;

最佳答案

回答问题:

How can i edit this code to close additional instances, but not the current one ?

FProcessEntry32.th32ProcessIDGetCurrentProcessId 进行比较. 如果它们匹配,就是您当前的流程。

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

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

关于delphi - 关闭应用实例但不关闭当前实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45281834/

相关文章:

delphi - 为什么我在控制台打印 PChar 时会出现问号?

windows - 使用 ShellExecuteEx 启动外部应用程序并等待它初始化

visual-studio-2010 - Windows的等效于gettimeday()

c++ - 什么标题包含 HR 功能定义? ( window 编程)

c# - 在 C# 中从外部应用程序获取 UI 文本

delphi - 是否可以从 Delphi IDE 以管理员身份运行应用程序

Delphi自定义动画-碰撞检测

delphi - 在 Delphi 中创建 float 抗锯齿文本窗口

delphi - 创建自定义表单设计器

c# - 如何在 C# 中模拟 Delphi 2007 SecondsBetween 函数?