سؤال

لدي تطبيق Windows Forms حيث يجلس في منطقة الإخطار. النقر فوق الرمز يجلبه إلى الأمام ، أو النقر فوقه مرة أخرى (أو النقر فوق أيقونة التطبيق X) بإرساله مرة أخرى. هذا هو نوع التطبيق الذي يكون وجود النافذة دائمًا في الأعلى أمرًا مهمًا عند عرضه من خلال النقر على الرمز (إنه اختياري).

النقر بزر الماوس الأيمن على الرمز يثير قائمة سياق حيث يمكن للمرء تحديد لتمكين خيار "دائمًا في الأعلى" أم لا. عندما يبدأ التطبيق لأول مرة ، تتم قراءة إعدادات التطبيق من ملف XML و 99 ٪ من أن هذا يعمل ، TopMost يتم قراءة الخاصية بشكل صحيح (وكتابة).

بعد مرور بعض الوقت (دقائق ، ساعات ، أيام ، أيا كان ؛ عادة ما أسبق ونادرا ما تغلق) TopMost توقف عن العمل. لا أقوم بتغيير الخيار ، لا أعتقد أن أي شيء يغير قيمة الخيار ، لكنني أنقر على أيقونة منطقة الإخطار والتطبيق لم يتم طرحه في المقدمة. يظهر ولكنه على الخلفية (يعرض في علامة التبويب ALT+) ، فهو ليس "دائمًا في الأعلى" كما ينبغي. أحضر قائمة السياق ، وأعطف الخيار (لأن تمكينه) وأمكّنه مرة أخرى ويبدأ العمل بعد ذلك. التطبيق الآن "دائمًا في القمة". ومع ذلك ، يمكن أن تفقد هذه القدرة في أي وقت بعد فترة.

لا أستطيع أن أفهم لماذا يحدث هذا وكيف يحدث هذا. هل لدى أحد أي فكرة لماذا؟ إذا لم يكن الأمر كذلك ، أي فكرة كيف يمكنني محاولة تصحيح مثل هذا السلوك؟

تعديل:
أضفت قطعة من التعليمات البرمجية لإظهار مراسلة الرسائل عندما تكون TopMost تم تغيير الممتلكات لمعرفة ما إذا كان بإمكاني ملاحظة أي سلوك غريب ولكن لم يكن جيدًا. لم يساعد ذلك لأن النموذج كان مع TopMost = true لكنه كان لا يزال في الخلفية ...

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

المحلول

هناك أكثر من مجرد نافذة "أعلى". أعلى فقط يقول "قبل جميع النوافذ غير القصوى".

أنا متأكد تمامًا من إعادة توحيد سطح المكتب (مثل عند الإسبات) يتطلب آخر SetWindowPos(hwnd, HWND_TOPMOST, ...) (وهو مكالمة WIN32 API الأساسية).

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

احتمال آخر هو أن إخفاء النافذة يغير أيضًا ترتيب Z - إما ضمنيًا كيف ينفذ Win32 ذلك ، أو بشكل واضح في الطريقة التي يتصل بها Winforms إلى نافذة Hide/Show.

نصائح أخرى

مثل Peterchen ، ليس لدي أدنى فكرة عن كيفية الحصول على السبب الجذري. ولكن لماذا لا تجعل الأمر أكثر بساطة؟

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

أعلم أنه سيكون من الرائع معرفة السبب الجذري ، لكن ربما لا يستحق الأمر إذا كان بإمكانك حلها بمثل هذا الحل البديل.

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