حلقات رسالة Win32:هل تريد الخروج بعد إغلاق النافذة باستخدام GetMessage(&msg, NULL, 0, 0)؟
-
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
يمكن التحقق من النافذة (التأكيد).