حلقات رسالة Win32:هل تريد الخروج بعد إغلاق النافذة باستخدام GetMessage(&msg, NULL, 0, 0)؟

StackOverflow https://stackoverflow.com/questions/4893295

  •  28-10-2019
  •  | 
  •  

سؤال

إذا كان لدي الكود التالي أدناه، فكيف يمكنني اكتشاف متى تم إغلاق النافذة، حتى أتمكن من الخروج؟ r لا يبدو أبدًا أنه يحصل على القيمة -1 0, ، وأحتاج إلى معالجة الرسائل للموضوع بأكمله، وليس للنافذة الحالية فقط.

HWND hWnd = CreateWindowExW(0, L"Edit", L"My Window", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, SW_SHOWDEFAULT);
MSG msg;
BOOL r;
while ((r = GetMessageW(&msg, NULL, 0, 0)) != 0)
{
    if (r == -1) { break; }
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
}
هل كانت مفيدة؟

المحلول

انتظر ل r = -1 ليست الطريقة التي تكتشف بها أن نافذتك قد أغلقت.القيمة المرجعة -1 ليست حالة عادية:يشير إلى حدوث خطأ في حلقة الرسالة.

من توثيق:

قيمة الإرجاع

يكتب: BOOL

إذا قامت الوظيفة باسترداد رسالة أخرى غير WM_QUIT, ، قيمة الإرجاع غير صفر.

إذا قامت الدالة باسترداد WM_QUIT الرسالة، قيمة الإرجاع هي صفر.

إذا كان هناك خطأ، فإن قيمة الإرجاع هي -1.على سبيل المثال، تفشل الدالة إذا كان hWnd مؤشر نافذة غير صالح أو lpMsg هو مؤشر غير صالح.للحصول على معلومات خطأ موسعة، اتصل GetLastError.

متى GetMessage يسترد أ WM_QUIT رسالة من قائمة الانتظار، فسوف تُرجع القيمة 0، ويجب عليك إنهاء الحلقة.

إذا كنت تريد فقط معرفة متى تم إغلاق النافذة، فمن المحتمل أنك تريد التعامل مع أي من الأمرين WM_CLOSE أو WM_DESTROY رسائل.ولمناقشة هذه الرسائل راجع أجوبة هذا السؤال: ما الفرق بين WM_QUIT وWM_CLOSE وWM_DESTROY في برنامج ويندوز؟

نصائح أخرى

لقد وجدت حلاً لهذا: WM_NULL.
يمكن لحلقة الرسالة التعامل مع الأمر بمفردها بشكل مستقل WndProc:

// written in C# 
MSG msg = new MSG();
while (GetMessage(out msg, window, 0, 0))
{
    if ((msg.message == WM_NULL) && !IsWindow(window))
        break;
    TranslateMessage(ref msg);
    DispatchMessage(ref msg);
}
Console.WriteLine("yeah, out of loop ^^");

من ملاحظتي: عندما يتم تدمير النافذة GetMessage يسترد WM_NULL رسائل بدون توقف مؤقت (التلميح الأول) و IsWindow يمكن التحقق من النافذة (التأكيد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top