[Delphi] アプリケーションの多重起動を防止する (Win32)

Atomを使う方法 FindWindow を使う方法などアプリケーションの多重起動防止方法にはいろいろありますが、 ここではもっとも実装が簡単だと思われるMutexを使った方法をご紹介します。
Windows APIの CreateMutex を使用して Mutex を作成します。すでに同じ名前を持つ Mutex が作成されていた場合、 CreateMutex は「ERROR_ALREADY_EXISTS」を返します。この場合実行を進めると二重起動となるので、 すぐに RelaseMutex で Mutex を開放して終了します。その他の場合には、通常通りプログラムを起動します。

※注意 CreateMutex を使用するには、uses 節に Windows ユニットを追加する必要があります。

以下に例を示します。以下の例は、すでにアプリケーションのほかのインスタンスが起動していた場合には、 そのインスタンスをアクティブにする処理が追加されています。
(ほぼ同時に起動した場合、アクティブにできない可能性があります。)

program Project1;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
  hMutex: THandle;
  hApp: THandle;
begin
  // ユニークな名前でMutexを作成する 
  hMutex := CreateMutex(nil, true, 'MyApp');
  // もし失敗したら、すでにほかのインスタンスが存在する
  if (hMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
  begin
    Application.MessageBox('すでに起動しています。2つ同時には起動できません。',
      '多重起動禁止', MB_ICONERROR or MB_OK);
    // 探すWindowはMainFormで、引数にMainFromのクラスと、キャプションを指定
    hApp := FindWindow('TForm1', 'Form1');    // 探すWindowは、MainForm
    if (hApp <> 0) then SetForeGroundWindow(hApp);
  end
  else
  begin
    Application.Initialize;
    // MainFormには、ユニークなクラス名とキャプションをつけたほうがいいです
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
  if (hMutex <> 0) then ReleaseMutex(hMutex);
  if (hMutex <> 0) then CloseHandle(hMutex);
end.

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0008