{unit inlectInstance;/t/t/t/t/t/t}
{/t/t/t/t/t/t/t/t/t}
{前のアプリケーションインスタンスが存在するかどうかを確認してください、はい、前の/t}
{インスタンスがアクティブになり、現在のインスタンスは終了します。/t}
{/t/t/t/t/t/t/t/t/t}
{savetime、http://savetime.delphibbs.com 2004/6/27/t/t}
{/t/t/t/t/t/t/t/t/t}
{usage:/t/t/t/t/t/t/t/t}
{このユニットをDelphiプロジェクトに含め、やるべきことはもうありません。/T}
{/t/t/t/t/t/t/t/t/t}
{重要:/t/t/t/t/t/t/t}
{プロジェクトラインを削除してはいけません:application.Initialize;/t}
{/t/t/t/t/t/t/t/t/t}
{注:/t/t/t/t/t/t/t}
{このユニットは、それによってアプリケーションを識別します 'はexeファイル名です。だから、あなたが望むなら}
{別の一意のアプリケーション名を指定するには、値を変更する必要があります}
{checkpriviousinstance procedure./t/t}のuniqueapplicationname
{/t/t/t/t/t/t/t/t/t}
ユニットユニークインスタンス;
インタフェース
クラス、sysutils、windows、フォームを使用します。
実装
var
UniqueMessageId:uint;
UniqueMutexhandle:Thandle;
以前のwndproc:tfnwndproc;
NextInitProc:Pointer;
function ApplicationWndProc(hwnd:hwnd; umsg:uint; wparam:wparam;
LPARAM:LPARAM):lResult; stdcall;
始める
//注: "<>"を使用すると、アプリケーション速度が上がる可能性があります。
umsg <> uniquemessageidの場合
結果:= callwindowproc(以前のwndproc、hwnd、umsg、wparam、lparam)
それ以外の場合は始まります
isiconic(application.handle)の場合、application.restore;
SetForeGroundWindow(Application.Handle);
結果:= 0;
終わり;
終わり;
手順BringPreiviousInstanceForeGround;
const
bsmrecipients:dword = bsm_applications;
始める
broadcastsystemmessage(bsf_ignorecurrenttaskまたはbsf_postmessage、
@BSMRECIPIENTS、UNIQUEMESSAGEID、0、0);
停止;
終わり;
手順サブクラソップライセーション。
始める
以前のwndproc:= tfnwndproc(setwindowlong(application.handle、gwl_wndproc、
integer(@applicationwndproc)));
終わり;
手順CheckPreviousInstance;
var
UniqueApplicationName:PCHAR;
始める
//一意のアプリケーション名、デフォルトはexeファイル名に設定されています、
//自分に変更できます。
UniqueApplicationName:= pCher(extractfileName(application.exename));
//一意のメッセージIDを登録します
UniqueMessageId:= RegisterWindowMessage(uniqueapplicationname);
// Mutexオブジェクトを作成します
uniquemutexhandle:= createmutex(nil、false、uniqueapplicationname);
// Mutexの作成に障害が発生し、アプリケーションを終了します
uniquemutexhandle = 0の場合
停止
//同じ名前のMutexが存在し、前のインスタンスを表示します
それ以外の場合は、getLasterRor = error_already_exists次に
BringPreiviousInstanceForeGround
//前のインスタンスはありません、サブクラスアプリケーションウィンドウ
それ以外
サブクロサプリケーション;
// Next initprocを呼び出します
nextinitproc <> nilの場合、tprocedure(nextinitproc);
終わり;
初期化
// initprocを使用してプライベートインスタンスを確認する必要があります。
//アプリケーションの理由が作成されていないため!
NextInitProc:= initProc;
initProc:= @CheckPreviousInstance;
ファイナライゼーション
// Mutexハンドルを閉じます
uniquemutexhandle <> 0の場合、CloseHandle(uniquemutexhandle);
終わり。