我要检查我的应用程序是否已经在运行,并关闭重复的实例。
在我的代码中使用基于应用程序文件名的信号灯(如果已经存在),暂停新实例:
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有效...
问题是:有一种标准/通用的方法可以做到吗?
我看到一些用户使用互斥锁,但似乎使用了相同的信号量,其他用户遍历进程列表并检查是否已经存在相同的进程名称...