{단위 고유 한 instance;/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/27/t/t}
{/t/t/t/t/t/t/t/t/t/t}
{usage :/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}
{프로젝트 라인을 제거해서는 안됩니다. Application.Initialize;/t}
{/t/t/t/t/t/t/t/t/t/t}
{참고 :/t/t/t/t/t/t/t/t/t}
{이 장치는 exe 파일 이름으로 응용 프로그램을 식별합니다. 그래서, 당신이 원한다면}
{다른 고유 한 응용 프로그램 이름을 지정하려면 값을 변경해야합니다}
{checkpriviousInstance process./t/t}의 iriqueApplicationName.
{/t/t/t/t/t/t/t/t/t/t}
단위 고유의 경우;
인터페이스
클래스, sysutils, Windows, 양식을 사용합니다.
구현
var
iriquemessageid : uint;
Iliquemutexhandle : Thandle;
previouswndproc : tfnwndproc;
NextInitProc : 포인터;
함수 applicationwndproc (hwnd : hwnd; umsg : uint; wparam : wparam;
lparam : lparam) : lresult; stdcall;
시작하다
// 참고 : "<>"을 사용하면 적용 속도가 향상 될 수 있습니다.
umsg <> iriquemessageid라면
결과 : = CallwindowProc (previouswndproc, hwnd, umsg, wparam, lparam)
그렇지 않으면 시작합니다
ISICONC (Application.Handle) 인 경우 Application.Restore;
setforegroundwindow (application.handle);
결과 : = 0;
끝;
끝;
절차를 가져 오기 시작한 후;
Const
bsmrecipients : dword = bsm_applications;
시작하다
BroadcastSystemMessage (BSF_IGNORECURRENTTASK 또는 BSF_POSTMESSAGE,
@bsmrecipients, iriquemessageid, 0, 0);
정지;
끝;
절차 하위 클래스 포플리케이션;
시작하다
previouswndproc : = tfnwndproc (setwindowlong (application.handle, gwl_wndproc,
정수 (@applicationwndproc));
끝;
절차 CheckpreviousInstance;
var
iriqueApplicationName : pchar;
시작하다
// 고유 한 응용 프로그램 이름, 기본 설정 exe 파일 이름으로 설정
// 자신에게 변경할 수 있습니다.
iriqueApplicationName : = pchar (extractfilename (application.exename));
// 고유 한 메시지 ID를 등록합니다
IliquemessageId : = registerWindowMessage (IliqueApplicationName);
// MUTEX 객체를 만듭니다
iriquemutexhandle : = createmutex (nil, false, iriqueApplicationName);
// MUTEX를 만들고 실패하고 애플리케이션을 종료합니다
iriquemutexhandle = 0이면
정지
// 동일 한 이름의 MUTEX가 존재하고 이전 인스턴스를 표시하십시오
그렇지 않으면 getLasterror = error_already_exists
Groundground
// 이전 인스턴스, 서브 클래스 응용 프로그램 창이 없습니다
또 다른
서브 클래스 포플리케이션;
// 다음 시작 프로그램에 전화하십시오
nexinitproc <> nil이면 tprocedure (NextInitProc);
끝;
초기화
// initproc을 사용하여 privious 인스턴스를 확인해야합니다.
// 응용 프로그램의 이유가 생성되지 않았기 때문에!
NextInitProc : = initproc;
initproc : = @checkpreviousInstance;
마무리
// 뮤텍스 핸들을 닫습니다
iriquemutexhandle <> 0 인 경우 닫기 (eliquemutexhandle);
끝.