كيفية الحصول على مقبض إطار وحدة تحكم (HWND)

ملخص

قد يكون من المفيد معالجة إطار المرتبطة بتطبيق وحدة تحكم. يوفر Win32 API أي أسلوب مباشر للحصول على مقبض الإطار المقترن بتطبيق وحدة تحكم. ومع ذلك، يمكنك الحصول على مقبض الإطار عن طريق استدعاء findwindow (). تسترد هذه الدالة مقبض إطار استناداً إلى اسم الفئة أو اسم الإطار.


استدعاء GetConsoleTitle() لتحديد عنوان وحدة التحكم الحالية. ثم قم بتوفير عنوان وحدة التحكم الحالية إلى findwindow ().

مزيد من المعلومات

نظراً لإمكانية احتواء windows متعددة على نفس العنوان، يجب تغيير عنوان إطار وحدة التحكم الحالية لعنوان فريد. سيساعد هذا في منع يتم إرجاع مؤشر الإطار غير صحيح. استخدام SetConsoleTitle() لتغيير عنوان إطار وحدة التحكم الحالية. هنا هو العملية:

  1. استدعاء GetConsoleTitle() لحفظ عنوان إطار وحدة التحكم الحالية.
  2. استدعاء SetConsoleTitle() لتغيير عنوان وحدة التحكم لعنوان فريد.
  3. تم تحديث الاتصال Sleep(40) للتأكد من عنوان الإطار.
  4. استدعاء FindWindow (فارغة، أونيكويتيتلي)، للحصول على هذه الدعوة HWND إرجاع HWND-أو NULL إذا فشلت العملية.
  5. استرداد استدعاء SetConsoleTitle() بالقيمة من الخطوة 1، لاستعادة عنوان الإطار الأصلي.
يجب اختبار HWND الناتج. على سبيل المثال، يمكنك اختبار لمعرفة إذا كان HWND التي تم إرجاعها تتوافق مع العملية الحالية عن طريق استدعاء GetWindowText() على HWND ومقارنة النتائج مع GetConsoleTitle().


HWND الناتج لا يضمن أن يكون مناسبة لكافة عمليات مقبض الإطار.

نموذج لتعليمة برمجية

الدالة التالية باسترداد الحالي وحدة تحكم التطبيق مقبض الإطار (HWND). في حال نجاح الدالة، قيمة الإرجاع هي مقبض إطار وحدة التحكم. إذا فشلت الدالة قيمة الإرجاع هي NULL. بعض الأخطاء حذف، للإيجاز.

   HWND GetConsoleHwnd(void)   {
#define MY_BUFSIZE 1024 // Buffer size for console window titles.
HWND hwndFound; // This is what is returned to the caller.
char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
// WindowTitle.
char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
// WindowTitle.

// Fetch current window title.

GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

// Format a "unique" NewWindowTitle.

wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());

// Change current window title.

SetConsoleTitle(pszNewWindowTitle);

// Ensure window title has been updated.

Sleep(40);

// Look for NewWindowTitle.

hwndFound=FindWindow(NULL, pszNewWindowTitle);

// Restore original window title.

SetConsoleTitle(pszOldWindowTitle);

return(hwndFound);
}

خصائص

رقم الموضوع: 124103 - آخر مراجعة: 09‏/01‏/2017 - المراجعة: 1

تعليقات