لماذا يمكن للخصائص الخاصة بي، التي تظهر من أيقونة علبة النظام، قفل شريط المهام؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

ملاحظة: تم تبسيط عينات التعليمات البرمجية، ولكن البنية الإجمالية لا تزال سليمة.

أنا أعمل على تطبيق Win32 واجهته الرئيسية أيقونة علبة النظام. أنا خلق نافذة دمية، باستخدام HWND_MESSAGE كوالدها، لتلقي رسائل الأيقونات:

WNDCLASSEX wndClass;
wndClass.lpfnWndProc = &iconWindowProc;
// ...
iconWindowHandle = CreateWindow(wndClass.lpszClassName, _T(""), 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_MESSAGE, NULL, GetModuleHandle(NULL), 0);

ثم يتم إنشاء الرمز، والرجوع إلى نافذة الرسالة فقط:

NOTIFYICONDATA iconData;
iconData.hWnd = iconWindowHandle;
iconData.uCallbackMessage = TRAYICON_MESSAGE;
// ...
Shell_NotifyIcon(NIM_ADD, &iconData)

عند النقر نقرا مزدوجا من أيقونة الدرج، أقوم بإنشاء وإظهار صفحة خاصية (من comctl32.dll):

LRESULT CALLBACK iconWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
    case TRAYICON_MESSAGE:
      switch (lParam) { // that contains the "real" message
        case WM_LBUTTONDBLCLK:
          showPropertySheet();
          return 0;
        // ...
      }
      break;
    // ...
  }
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

لا تحتوي صفحة الممتلكات على نافذة أحد الوالدين. ال PropertySheet يتم استدعاء الدالة من إجراء النافذة لإطار الرسالة فقط. ال PSH_MODELESS لم يتم تعيين العلم؛ هكذا، PropertySheet فقط إرجاع بعد إغلاق نافذة صفحة الخصائص مرة أخرى:

void showPropertySheet() {
  PROPSHEETPAGE pages[NUM_PAGES];
  pages[0].pfnDlgProc = &firstPageDialogProc;
  // ...
  PROPSHEETHEADER header;
  header.hwndParent = NULL;
  header.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK;
  header.ppsp = pages;
  // ...
  PropertySheet(&header);
}

الآن كل هذا يعمل بشكل جيد فقط، حتى تعيين نقطة توقف داخل إجراءات الحوار لأحد صفحات صفحة الخصائص:

BOOL CALLBACK firstPageDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  return FALSE; // breakpoint here
}

عندما يتوقف البرنامج على نقطة التوقف، شريط المهام بأكمله يغلق!

مكدس المكالمات لا طائل منه تماما؛ يوضح أن إجراء مربع الحوار يسمى من مكان ما في الداخل comctl32.dll, ، عبر بعض المكالمات في الداخل user32.dll. وبعد لا يوجد إجراء نافذة خاصة بي.

جعل ورقة الخصائص غير مشروط لا يبدو للمساعدة. أيضا، أفضل عدم القيام بذلك لأنه يجعل الرمز أكثر تعقيدا.

طالما أن إجراء الحوار الخاص بي يعود بسرعة كافية، لا ينبغي أن يكون هذا مشكلة. ولكن يبدو غريبا للغاية أن عملية أطول داخل إجراءات الحوار لن تقوم بإغلاق مربع الحوار فقط، ولكن القشرة بأكملها. أستطيع أن أتخيل أن إجراء النوافذ الرسالة فقط لديه القدرة على تسبب هذا السلوك، لأنه يرتبط ارتباطا وثيقا بأيقونة الدرج ... ولكن لا تظهر هذه الوظيفة على مكدس المكالمات.

هل أفعل شيئا خاطئا بشكل أساسي؟ يمكن لأي شخص أن يلقي بعض الضوء على هذه القضية؟

هل كانت مفيدة؟

المحلول

في الواقع، الأمر واضح إلى حد ما، ويجب أن يكون الارتباك بسبب نقص القهوة.

من المحتمل أن يستخدم شريط المهام SendMessage لإرسال الرسالة إلى طلبي، مما يؤدي إلى حظره حتى يتم التعامل مع الرسالة. SendMessageTimeout يبدو أنه غير مستخدم.

ما زلت أعتقد أنه من الغريب أنه لا توجد وظيفة لإظهار بلدي على مكدس المكالمات. بالتأكيد، يجب أن تتدفق هذه الرسالة من خلال حلقة رسالتي من أجل معالجة؟ ربما تحذير أن "إطارات المكدس تحت هذا الخط قد تكون غير مكتملة أو مفقودة" كانت في الواقع، ثم.

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