delphi:如何检查应用程序是否已在运行并关闭重复的实例?

时间:2018-07-17 14:49:22

标签: delphi delphi-10.1-berlin

我要检查我的应用程序是否已经在运行,并关闭重复的实例。

在我的代码中使用基于应用程序文件名的信号灯(如果已经存在),暂停新实例:

program MyProgram;

uses
  Vcl.Forms,
  Winapi.Windows,
  Vcl.Dialogs,
  System.SysUtils,
  System.UITypes,
  WinMain in 'WinMain.pas' {WMain};

{$R *.res}

var
  aSemafor: THandle;
  aAppName: string;
begin
  aAppName := ExtractFilename(Application.ExeName);
  aSemafor := CreateSemaphore(nil, 0, 1, PWideChar(aAppName));
  if (aSemafor <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    CloseHandle(aSemafor);
    MessageDlg(Format('Application "%s" is already running!', [aAppName]), mtError, [mbOk], 0);
    Halt;
  end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TWMain, WMain);
  Application.Run;
end.

t有效...

问题是:有一种标准/通用的方法可以做到吗?

我看到一些用户使用互斥锁,但似乎使用了相同的信号量,其他用户遍历进程列表并检查是否已经存在相同的进程名称...

0 个答案:

没有答案