簡體   English   中英

從IE BHO打開對話框時,如何確保對話框是模態對話框?

[英]How can I ensure a dialog will be modal when opened from an IE BHO?

我有一個用c#編寫的Internet Explorer瀏覽器幫助器對象(BHO),在不同的地方,我都將窗體作為模式對話框打開。 有時這可行,但在某些情況下卻無效。 我目前可以復制的情況是IE正在運行javascript來打開其他子窗口...我猜它在某處變得有些困惑....

問題是當我打電話時:

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

表單不是模態的,所以我可以單擊IE窗口,它會成為焦點。 由於IE正在運行我的代碼,因此它不會刷新,因此對於用戶來說IE似乎正在掛起。

有沒有一種方法可以確保將窗體作為模式打開,即該窗體無法隱藏在IE窗口后面。

(我正在使用IE7。)

注意:盡管使用的是Java,但這是與此帖子類似的問題。 我猜想解決方案是正確地在IE窗口的IWin32Window中傳遞,所以我正在研究。

這是Ryan / Rory的WindowWrapper代碼的更簡潔版本:

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

我不是想回答我自己的問題,而是...

看來,如果將正確的IWin32Window傳遞給ShowDialog()方法,它將可以正常工作。 訣竅是如何獲得此。 這是我的操作方式,其中“ siteObject”是傳遞給BHO的SetSite()方法的對象:

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;
}

感謝Ryan的WindowWrapper類,盡管我希望有一種內置的方法來執行此操作?

更新:這在帶有保護模式的IE8上不起作用,因為它正在訪問HWND,而不是它應該訪問的范圍。 相反,你將不得不使用當前選項卡的HWND(或一些其他的解決方案?),例如參見.NET示例這篇文章的得到那個的一種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM