{الوحدة الفريدة ؛/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/7/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. لذا ، إذا كنت تريد}
{لتحديد اسم تطبيق فريد آخر ، يجب عليك تغيير القيمة}
{uniquapplicationName in checkpriviousinstance oncount./t/t}
{/t/t/t/t/t/t/t/t/t}
وحدة فريدة من نوعها ؛
واجهة
يستخدم الفئات ، sysutils ، النوافذ ، النماذج ؛
تطبيق
var
uniquemessageid: uint ؛
uniquemutexhandle: Thandle ؛
السابق wndproc: tfnwndproc ؛
NextInitProc: مؤشر ؛
وظيفة ApplicationWndProc (hwnd: hwnd ؛ umsg: uint ؛ wparam: wparam ؛
LPARAM: LPARAM): lresult ؛ stdcall
يبدأ
// ملاحظة: استخدم "<>" قد يعزز سرعة التطبيق.
إذا umsg <> uniqueMessageId ثم
النتيجة: = CallWindowProc (Previourwndproc ، HWND ، UMSG ، WPARAM ، LPARAM)
آخر يبدأ
if Isiconic (application.handle) ثم application.restore ؛
setForeGroundWindow (application.handle) ؛
النتيجة: = 0 ؛
نهاية؛
نهاية؛
الإجراء prappreiviousinstanceforeground ؛
كونست
BSMRecipients: dword = bsm_applications ؛
يبدأ
BroudcastsystemMessage (BSF_IngorEcurrentTask أو BSF_PostMessage ،
pbsmRecipients ، uniquemessageid ، 0 ، 0) ؛
وقف؛
نهاية؛
الإجراء الفئة الفرعية ؛
يبدأ
السابق wndproc: = tfnwndproc (setWindowlong (application.handle ، gwl_wndproc ،
عدد صحيح (apPlicationWndProc))) ؛
نهاية؛
الإجراء checkpreviousinstance ؛
var
uniquapplicationName: PCHAR ؛
يبدأ
// اسم تطبيق فريد ، تعيين افتراضي إلى اسم ملف exe ،
// يمكنك تغييره إلى نفسك.
uniquapplicationName: = pchar (extractFilename (application.exename)) ؛
// سجل معرف رسالة فريدة
uniqueMessageId: = registerWindowMessage (uniquapplicationName) ؛
// إنشاء كائن mutex
uniquemutexhandle: = createMutex (nil ، false ، uniquapplicationName) ؛
// فشل إنشاء Mutex ، إنهاء التطبيق
إذا emiquemutexhandle = 0 ثم
وقف
// نفس المسمى Mutex ، إظهار مثيل سابق
آخر إذا getLasterRor = error_already_exist
BringPreiviousInstanceForeground
// لا مثيل سابق ، نافذة تطبيق الفئة الفرعية
آخر
الفئة الفرعية.
// استدعاء initProc التالي
إذا nextInitProc <> nil ثم tprocedure (nextInitProc) ؛
نهاية؛
التهيئة
// يجب استخدام InitProc للتحقق من مثيل خاص ،
// لأن سبب التطبيق لم يتم إنشاؤه!
NextInitProc: = itingproc ؛
initProc: = checkpreviousinstance ؛
الانتهاء
// أغلق مقبض Mutex
إذا كان uniqueMutexHandle <> 0 ثم يغلق (uniquemutexhandle) ؛
نهاية.