{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);
结尾。