代码之家  ›  专栏  ›  技术社区  ›  delphirules

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

  •  2
  • delphirules  · 技术社区  · 7 年前

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

    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;
    
    1 回复  |  直到 7 年前
        1
  •  8
  •   kobik    7 年前

    回答问题:

    当前一个?

    比较 FProcessEntry32.th32ProcessID 具有 GetCurrentProcessId 如果它们匹配,这是您当前的流程。

    也就是说,我强烈建议您不要使用这种方法来创建单实例应用程序,正如@Jerry已经提到的那样。
    考虑一下:您的程序是 跑步 跑步 应用程序将被第二个实例杀死。相反,让第二个实例终止 如果它发现一个已经在运行的实例(可以选择通知正在运行的进程,这样它就可以把自己带到前台)。