سؤال

أحاول استخدام الرمز في هذا مقالة - سلعة هذا يتيح لك معرفة متى يكون تطبيقك في وضع الخمول ..

يعمل هذا الرمز بشكل رائع إذا كان للتطبيق نموذج واحد فقط. أنت أتصل Application2.Run(myOnlyForm) على ذلك ويتم توجيه جميع الرسائل من خلال المرشحات في Application2.

ولكن إذا كنت تتصل في أي وقت mySecondForm.ShowDialog() لا يحصل مربع الحوار هذا على ترشيح رسائله من خلال Application2.

هل هناك أي طريقة (مع آثار جانبية سيئة) للحصول على الرسائل mySecondForm للذهاب من خلال مرشحات الأحداث "Application2"؟

لقد حاولت:

  1. التغيير mySecondForm.ShowDialog إلى Application2.Run(mySecondForm).
    • هذا يتسبب في عدم تنظيف النافذة عندما تنفد من النطاق وعدم إظهارها عند الحاجة.
  2. التغيير mySecondForm.ShowDialog إلى Application2.ShowDialog(mySecondForm).
    • هذا يسبب القائمة الرئيسية على mySecondForm لعدم العمل (النقر ليس له أي تأثير ، فقط الصفير).
      • هذا يبدو وكأنه الشخص الذي يجب أن أستخدمه ، لكنني أحتاج إلى قوائم على شاشاتي. يبدو أن هذا أ مشترك مشكلة مع OpenNetcf.
      • عنصر القائمة غير مكسور. استخدام المفتاح الساخن للقائمة لا يزال يعمل. مجرد النقر على القائمة لا يعمل.
  3. التغيير mySecondForm.ShowDialog إلى Application2.ShowDialog(mySecondForm, true) (True = تنظيف مربع الحوار).
    • هذا لا يعمل لأنني بحاجة إلى الوصول إلى مربع الحوار بعد إغلاقه في بعض الأحيان.

من الناحية المثالية ، أرغب في إرفاق نموذج بقدرات رسالة Application2.

لكني أرحب بأي اقتراحات.


تحرير: استنادًا إلى اقتراح ctacke هذا ما فعلته:

public static DialogResult ShowDialog2(this Form form)
{
    //form.Activated += InsertMenu;
    //Application2.ShowDialog(form);
    form.Show();
    try
    {
        do
        {
            Application2.DoEvents();
        } while (form.Visible);
    }
    catch (ObjectDisposedException)
    {
        // This just means that the form was closed.  Not a big deal.
    }
    return form.DialogResult;

}

انتهى بي الأمر إلى استدعاء showdialog2 بدلاً من showdialog

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

المحلول

يمكنني شرح السلوك ، على الرغم من عدم تقديم حل مباشر.

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

الآن ، يوجد المرشح الذي أضفته في مضخة الرسائل الرئيسية وهو يبحث في جميع الرسائل هناك ، لكن استدعاء showdialog يتنقل - لن تصل الرسائل إلى مربع الحوار أبدًا إلى المرشح.

الآن أضفنا التطبيق. حسنا تم تنفيذه. استنادًا إلى تقريرك ، أخاطر بتخمين "ليس جيدًا" على الرغم من أنه ليس من مشكلة في حلها. إن جذر هذه المشكلة هو أن SDF لا يتحكم في ما يحدث في BCL عند استدعاء العرض و showdialog - نحاول ببساطة الجلوس فوقه ونوفر أفضل سلوك يمكننا. في هذه الحالة ، إنها مشكلة.

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

نصائح أخرى

عفوا عن السؤال ، ولكن لماذا تمر بكل هذا القدر المجنون من المشاكل لشيء بسيط؟ بالنظر إلى المقالة التي ربطتها ، كل ما تفعله هو بدء مؤقت وإعادة ضبطه كل شيء WM_KEYUP, WM_MOUSEMOVE أو WM_LBUTTONUP حدث.

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

(*) لا تضع علامة عليها على أنها مجردة أو أن مصمم النماذج سوف يرمي نوبة منسق.

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