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.

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。