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件)