{หน่วยที่ไม่ซ้ำกันฯ
{/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/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}
{คุณต้องไม่ลบบรรทัดโครงการ: application.initialize;/t}
{/t/t/t/t/t/t/t/t/t}
{หมายเหตุ:/t/t/t/t/t/t/t/t}
{หน่วยนี้ระบุแอปพลิเคชันโดยชื่อไฟล์ EXE ของมัน ดังนั้นถ้าคุณต้องการ}
{ในการระบุชื่อแอปพลิเคชันที่ไม่ซ้ำกันอื่นคุณต้องเปลี่ยนค่า}
{uniqueapplicationName ใน proctriviousinstance procedure./t/t}
{/t/t/t/t/t/t/t/t/t}
หน่วยที่ไม่ซ้ำกัน
ส่วนต่อประสาน
ใช้คลาส, sysutils, windows, รูปแบบ;
การดำเนินการ
วาจา
UniquemessageID: UINT;
Uniquemutexhandle: Thandle;
ก่อนหน้า wndproc: tfnwndproc;
NextInitProc: ตัวชี้;
ฟังก์ชั่นแอปพลิเคชัน WNDPROC (HWND: HWND; UMSG: UINT; WPARAM: WPARAM;
LPARAM: LPARAM): LRESULT; stdcall;
เริ่ม
// หมายเหตุ: ใช้ "<>" อาจเพิ่มความเร็วแอปพลิเคชัน
ถ้า ummsg <> uniquemessageId แล้ว
ผลลัพธ์: = CallWindowProc (ก่อนหน้า wndproc, HWND, UMSG, WPARAM, LPARAM)
เริ่มต้นอื่น
ถ้า isiconic (application.handle) แล้ว application.restore;
setforegroundwindow (application.handle);
ผลลัพธ์: = 0;
จบ;
จบ;
ขั้นตอนนำเสนอ preiviousinstance foreground;
const
bsmrecipients: dword = bsm_applications;
เริ่ม
BroadcastSystemMessage (BSF_IGNORECURRENTTASK หรือ BSF_POSTMESSAGE
@BSMRECIPIENTS, UniquemessageID, 0, 0);
หยุด;
จบ;
ขั้นตอนการรวมกลุ่ม
เริ่ม
ก่อนหน้า wndproc: = tfnwndproc (setwindowlong (application.handle, gwl_wndproc,
จำนวนเต็ม (@ApplicationWndProc)));
จบ;
ขั้นตอนการตรวจสอบ previousinstance;
วาจา
uniqueapplicationName: pchar;
เริ่ม
// ชื่อแอปพลิเคชันที่ไม่ซ้ำกันตั้งค่าเริ่มต้นเป็นชื่อไฟล์ exe
// คุณสามารถเปลี่ยนเป็นตัวเองได้
uniqueapplicationName: = pchar (extractfilename (application.exename));
// ลงทะเบียนรหัสข้อความที่ไม่ซ้ำกัน
UniquemessageId: = registerWindowMessage (uniqueapplicationName);
// สร้างวัตถุ mutex
UniquemutexHandle: = createMutex (ไม่มี, เท็จ, uniqueapplicationName);
// สร้าง mutex ล้มเหลวยกเลิกแอปพลิเคชัน
ถ้า uniquemutexhandle = 0 แล้ว
หยุด
// มีชื่อเดียวกันกับ Mutex แสดงอินสแตนซ์ก่อนหน้า
อย่างอื่นถ้า getLasterRor = error_already_exists แล้ว
นำเสนอ previousinstance forreground
// ไม่มีอินสแตนซ์ก่อนหน้าหน้าต่างแอปพลิเคชันย่อย
อื่น
subclassapplication;
// โทรไปที่ InitProc ถัดไป
หาก NextInitProc <> ไม่มี tprocedure (nextInitProc);
จบ;
การเริ่มต้น
// ต้องใช้ InitProc เพื่อตรวจสอบอินสแตนซ์ส่วนตัว
// เนื่องจากเหตุผลของแอปพลิเคชันไม่ได้ถูกสร้างขึ้น!
NextInitProc: = InitProc;
InitProc: = @CheckPreviousInstance;
การสรุป
// ปิดที่จับ mutex
ถ้า UniquemutexHandle <> 0 จากนั้น closeHandle (Uniquemutexhandle);
จบ.