كيف يمكنني التأكد من أن مربع الحوار سيكون مشروطًا عند فتحه من IE BHO؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي كائن مساعد متصفح Internet Explorer (BHO)، مكتوب بلغة c#، وفي أماكن مختلفة أفتح النماذج كمربعات حوار مشروطة.في بعض الأحيان يعمل هذا ولكن في بعض الحالات لا يعمل.الحالة التي يمكنني تكرارها في الوقت الحاضر هي حيث يقوم IE بتشغيل جافا سكريبت لفتح نوافذ فرعية أخرى ...أعتقد أن الأمر أصبح مرتبكًا بعض الشيء في مكان ما....

المشكلة هي أنني عندما أتصل:

(new MyForm(someParam)).ShowDialog();

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

هل هناك طريقة لضمان فتح النموذج كنموذج، أي أنه ليس من الممكن إخفاء النموذج خلف نوافذ IE.

(أنا أستخدم IE7.)

ملحوظة:هذا سؤال مشابه لـ هذا المشنور على الرغم من أن هذا يستخدم Java.أعتقد أن الحل يكمن في المرور بشكل صحيح في نافذة IWin32Window الخاصة بنافذة IE، لذا فأنا أبحث في ذلك.

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

المحلول 2

لم يكن في نيتي الإجابة على سؤالي، ولكن...

يبدو أنه إذا قمت بتمرير IWin32Window الصحيح إلى أسلوب ShowDialog() فسيعمل بشكل جيد.الحيلة هي كيفية الحصول على هذا.إليك كيفية القيام بذلك، حيث "siteObject" هو الكائن الذي تم تمريره إلى أسلوب SetSite() الخاص بـ BHO:

IWebBrowser2 browser = siteObject as IWebBrowser2;
if (browser != null) hwnd = new IntPtr(browser.HWND);
(new MyForm(someParam)).ShowDialog(new WindowWrapper(hwnd));

...

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

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

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

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

نصائح أخرى

إليك نسخة أكثر إيجازًا من كود Ryan/Rory's WindowWrapper:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top