function EnumWindowProc(hHandle: HWND; iLParam: LPARAM): BOOL;
stdcall;
var
lh_Owner: HWND;
begin
Result := True;
if (
gfnsClassNameGet(hHandle) = '
TForm1')
then begin
if (FindWindowEx(hHandle, 0, '
TGrabHandle',
nil) = 0)
then begin
//TGrabHandleというウィンドウはなかったので設計中のフォームではない
//つまりこのhHndleが目的のプログラムのウィンドウハンドル
lh_Owner := GetWindow(hHandle, GW_OWNER);
if (IsIconic(lh_Owner))
then begin
//最小化されていたら元に戻す
SendMessage(lh_Owner, WM_SYSCOMMAND, WPARAM(SC_RESTORE
and $FFF0), 0);
end;
//前面に移動させる
SetForegroundWindow(hHandle);
end;
//必要な処理を終えたので以降の処理(トップレベルウィンドウの列挙)を続行しない
Result := False;
end else begin
//TGrabHandleというウィンドウがあった
//設計中のフォーム
Beep;
end;
end;
第一引数にトップレベルウィンドウの値がセットされた状態でこの関数が呼ばれるので、その値を元にgfnsClassNameGetでクラス名を取得します。program test;
uses
Windows,
Messages,
SysUtils,
Forms,
Unit1
in 'Unit1.pas'
{Form1};
{$R *.res}
function gfnsClassNameGet(hHandle: HWND):
String;
//ウィンドウハンドルhHandleのクラス名を返す
const
lci_LEN = 256;
var
lp_Buff: PChar;
begin
Result := '';
lp_Buff := AllocMem((lci_LEN+1) * 2);
try
GetClassName(hHandle, lp_Buff, lci_LEN-1);
Result :=
String(lp_Buff);
finally
FreeMem(lp_Buff);
end;
end;
function EnumWindowProc(hHandle: HWND; iLParam: LPARAM): BOOL;
stdcall;
var
lh_Owner: HWND;
begin
Result := True;
if (gfnsClassNameGet(hHandle) = '
TForm1')
then begin
if (FindWindowEx(hHandle, 0, '
TGrabHandle',
nil) = 0)
then begin
//TGrabHandleとうぃうウィンドウはなかったので設計中のフォームではない
//つまりこのhHndleが目的のプログラムのウィンドウハンドル
lh_Owner := GetWindow(hHandle, GW_OWNER);
if (IsIconic(lh_Owner))
then begin
//最小化されていたら元に戻す
SendMessage(lh_Owner, WM_SYSCOMMAND, WPARAM(SC_RESTORE
and $FFF0), 0);
end;
//前面に移動させる
SetForegroundWindow(hHandle);
end;
//必要な処理を終えたので以降の処理(トップレベルウィンドウの列挙)を続行しない
Result := False;
end else begin
//TGrabHandleとうぃうウィンドウがあった
//設計中のフォーム
Beep;
end;
end;
begin
//二重起動チェック
if (CreateMutex(nil, False, 'Dsapbi203dap') <> 0)
//関数が成功して
and (GetLastError = ERROR_ALREADY_EXISTS)
//既に同名のミューテックスオブジェクトがあれば
then begin
//二重起動である
//まずメッセージを出す
Application.MessageBox('二重起動は許可されていません', 'メッセージ');
//先に起動しているプログラムを探す
EnumWindows(@EnumWindowProc, 0);
//プログラム終了
Exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.