يجب أن تشكل form.howdialog (iwin32window) العمل مع أي مقبض نافذة؟

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

سؤال

عند استخدام System.Windows.Forms.ShowDialog(IWin32Window), ، يجب أن أكون قادرا على المرور في IWin32Window تمثيل أي مقبض نافذة ولديها مشروط فيما يتعلق بهذه النافذة؟

كجزء من امتداد Internet Explorer 7، أحاول فتح مشروط نافذة فيما يتعلق باسم علامة تبويب Internet Explorer. إنها ليست علامة التبويب المحددة حاليا، ولكن يمكنني الحصول على HWND من علامة التبويب موافق. ومع ذلك، عندما اجتاز هذا ل SomeDialog يظهر النموذج الخاص بي، لكنه ليس مشروطا فيما يتعلق بأي شيء: لا يزال بإمكاني القيام بأشياء في Internet Explorer، بما في ذلك في علامة التبويب من المفترض أن تكون المالك. يظهر النموذج الخاص بي تطفو فوق Windows Internet Explorer ويبقى في الأعلى، لذلك ليس الأمر كما لو أنه تم فتحه كشكل عادي، لكنه غير مشروط بشكل صحيح.

استخدام جاسوس ++., ، يمكنني أن أجد النموذج الخاص بي ومقبض مالك هو محدد بشكل صحيح.

هل هذا يعني أن شيئا ما قد حدث خطأ، أو أفعل شيئا خطأ؟ كيف أقوم بإجراء شكلي بشكل صحيح مشروط؟

لمعلوماتك، أنا أستخدم فئة المجمع هذه لإنشاء IWin32Window من hwnd (شكرا ريان!):

/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

تحديث: باستخدام Internet Explorer 7 و .NET 2.0

تحديث: اللعب حول بعض أكثر مع التجسس ++ والمقابض التي تعرضها، أجد أنه إذا كنت تستخدم مختلفة hwnd ثم يمكنني جعل نافذتي مشروط إلى علامة التبويب:

كنت أستخدم علامة التبويب hwnd كما اقترح من قبل iwebbrowser2.hwnd Doc., ، والتي في تجسس ++ تظهر كصف TabWindowClass. وبعد لديها طفل من الطبقة Shell DocObject View, ، والتي لديها طفل من Internet_Explorer_Server. إذا كنت تستخدم hwnd التابع Internet Explorer_Server ثم يعمل بشكل صحيح، على سبيل المثال، عند النقر فوق الماوس في علامات تبويب أخرى، يتفاعل Internet Explorer بشكل طبيعي. عندما أضغط على الماوس في علامة تبويب الفائدة، فإنه يلعب صوت Windows D'Oh ولا يفعل أي شيء.

أنا لا أعرف بعد كيفية الحصول على Internet_Explorer_Server hwnd, ، ولكن يجب أن يكون ممكنا.

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

تحديث: ملاحظة جانبية أخرى: السبب الأصلي الذي أردت أن أجعل نموذجي نموذجي إلى علامة التبويب بدلا من النافذة بأكملها هو أنه عند فتح MessageBox من النموذج الخاص بي، اجتياز النموذج كمالك، MessageBox لن تفتح دائما على رأس النموذج الخاص بي. إذا تم فتح علامة تبويب جديدة لمستكشف Internet Explorer ولكن لم تكن نشطة ثم MessageBox سوف تكون مخفية وأن علامة التبويب ستبدأ الوميض. ومع ذلك، نظرا لأن Internet Explorer تم تعطيله من النموذج الذي تم فتحه، فلا من الممكن التحول إلى علامة التبويب هذه، لذلك سيتم تجميد Internet Explorer. اعتقدت أن فتح النموذج مشروط إلى علامة التبويب من شأنه أن يحل هذا، لكن لقد وجدت حلا آخر هو تجنب استخدام MessageBox: إذا كنت تستخدم النموذج الثاني و ShowDialog(this) من النموذج الأول الخاص بي، ثم يتم فتح النموذج الثاني بشكل صحيح إلى الجبهة. لذلك يبدو ذلك Form.ShowDialog() يعمل بشكل أفضل من ذلك MessageBox.Show() في بعض الحالات. المزيد من المناقشة في مشاكل مع مربعات الحوار مشروط وصناديق الرسائل.

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

المحلول

الرمز الخاص بك هو الصحيح. المشكلة التي من المحتمل أن تكون على الأرجح هي أن IE لديه نموذج خيوط يتعلق علامات التبويب الخاصة به. لا أعرف التفاصيل الدقيقة ولكن النسخة القصيرة هي أن كل علامة تبويب يمكن أن تعمل على مؤشر ترابط مختلف عن علامات التبويب الأخرى.

يعد Modal'ness من مربع الحوار خاصا بالموضوع حيث يعمل مربع الحوار. لن تتأثر واجهة المستخدم على مؤشرات الترابط الأخرى بواسطة مربع حوار نموذج حول مؤشر ترابط آخر. من الممكن تماما أن تكون قادرا على الوصول إلى علامات التبويب التي تعمل على مؤشر ترابط مختلف لهذا السبب.

نصائح أخرى

Showdialog () يفعل شيئان مهمان. يبدأ ضخ حلقة للرسالة حتى يتصرف مع رمز الاتصال. وتعطيل أي نوافذ أخرى في التطبيق باستخدام مكالمة API (FALSE) EnableWindow. هذا الأخير هو ما لا يحدث في قضيتك. ليس من المستغرب تماما، بالنظر إلى أن النافذة التي يجب تعطيلها ليست نافذة WF.

قد تحتاج إلى الاتصال EnableWindow () بنفسك. تأكد من إعادة تمكينه قبل إغلاق مربع الحوار أو سيذهب Windows للصيد لإنطاف تطبيق آخر لإعطاء التركيز عليه.

إليك نسخة موجزة أكثر من رمز النافذة في Ryan / Rory

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}

لم أحاول أبدا من امتداد IE، لكن لدي حدس قد لا "الاحترام" نافذة مشروط نمط Win32 بنفس الطريقة التي تقوم بها نافذة مشروطة تربيتها من جافا سكريبت باستخدام window.open().

هل اختبرت هذا الرمز مقابل شيء آخر غير IE، لمجرد تأكيد أنه يعمل بالطريقة التي يجب أن تكون بها للتطبيقات الأخرى؟

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