{unit unifyinstance;/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/T/T/T/T/T/T/T}
{由SaveTime撰寫,http://savetime.delphibbs.com 2004/6/6/27/t/t}
{/T/T/T/T/T/T/T/T/T/T/T}
{用法:/t/t/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/T/T/T/T/T}
{您不得刪除項目行:application.initialize;/t}
{/T/T/T/T/T/T/T/T/T/T/T}
{notes:/t/t/t/t/t/t/t/t/t/t}
{本單元通過IT'EXE文件名識別一個應用程序。所以,如果你想要}
{要指定另一個唯一的應用程序名稱,您必須更改值}
{checkpriviousInstance Procedure中的iniqueApplicationName./t/t}
{/T/T/T/T/T/T/T/T/T/T/T}
單位唯一的信息;
介面
使用類,系統,窗口,表單;
執行
var
IniquemessageId:uint;
Iniquemutexhandle:thandle;
上wndproc:tfnwndproc;
NextInitProc:指針;
功能應用程序WndProc(HWND:HWND; UMSG:UINT; WPARAM:WPARAM;
lparam:lparam):lresult; stdcall;
開始
//注意:使用“ <>”可能會提高應用程序速度。
如果umsg <> iniquemessageid,則
結果:= callwindowproc(preadwndproc,hwnd,umsg,wparam,lparam)
否則開始
如果Isiconic(application.handle),則application.restore;
setForegroundWindow(application.handle);
結果:= 0;
結尾;
結尾;
程序帶來了預處理;
const
BSMRECIPINTS:DWORD = BSM_APPLICATIONS;
開始
BroadcastSystemMessage(BSF_IGNORECURRENTTASK或BSF_POSTMESSAGE,
@bsmrecipient,iniquemessageId,0,0);
停止;
結尾;
過程子類應用程序;
開始
上一個wndproc:= tfnwndproc(setWindowlong(application.handle,gwl_wndproc,
integer(@applicationwndproc)));
結尾;
程序檢查;
var
IniqueApplicationName:PCHAR;
開始
//唯一的應用程序名稱,默認設置為EXE文件名,
//您可以將其更改為自己。
iniqueApplicationName:= pchar(extractfileName(application.exename));
//註冊唯一消息ID
IniquemessageID:= registerWindowMessage(iniqueApplicationName);
//創建Mutex對象
IniqueMuteXHandle:= createMutex(nil,false,iniqueaplicationName);
//創建Mutex失敗,終止應用程序
如果UniquemutexHandle = 0,則
停止
//存在同一命名的Mutex,顯示上一個實例
否則如果getlastror = error_aldread_exists,則
帶來了previousinstanceforeground
//沒有以前的實例,子類應用程序窗口
別的
子類應用;
//致電下一個initproc
如果NextInitProc <> nil,則tprocedure(nextInitProc);
結尾;
初始化
//必須使用initproc檢查特定實例,
//沒有創建應用程序的原因!
NextInitProc:= initproc;
initproc:= @checkpreviousInstance;
最終確定
//關閉Mutex手柄
如果iniquemutexhandle <> 0,則closeHandle(iniquemutexhandle);
結尾。