从IE BHO打开对话框时,如何确保对话框是模态对话框?

时间:2020-03-06 14:39:34  来源:igfitidea点击:

我有一个用c#编写的Internet Explorer浏览器帮助器对象(BHO),并且在不同的地方都打开了窗体作为模式对话框。有时这可行,但在某些情况下却无效。我目前可以复制的情况是IE正在运行javascript来打开其他子窗口...我想它在某处变得有些困惑...。

问题是当我打电话时:

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

表单不是模态的,所以我可以单击IE窗口,它会成为焦点。由于IE正在运行我的代码,因此它不会刷新,因此对于用户来说IE似乎正在挂起。

有没有一种方法可以确保该窗体将以模式打开,即该窗体不可能隐藏在IE窗口后面。

(我正在使用IE7. )

注意:尽管使用的是Java,但这是与此帖子类似的问题。我猜想解决方案是正确地在IE窗口的IWin32Window中传递,所以我正在研究它。

解决方案

我不是想回答我自己的问题,而是...

看来,如果将正确的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示例以获取该方法。

这是Ryan / Rory的WindowWrapper代码的更简洁版本:

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