C# 如何确保从IE BHO打开的对话框是模态对话框?

C# 如何确保从IE BHO打开的对话框是模态对话框?,c#,internet-explorer,bho,C#,Internet Explorer,Bho,我有一个用c#编写的Internet Explorer浏览器帮助对象(BHO),在不同的地方我打开表单作为模式对话框。有时这是可行的,但在某些情况下却不行。目前我可以复制的情况是IE正在运行javascript来打开其他子窗口。。。我想它在某个地方变得有点混乱 问题是当我打电话时: (new MyForm(someParam)).ShowDialog(); 表单不是模态的,所以我可以点击IE窗口,它得到焦点。由于IE处于运行我的代码的中间,所以它不刷新,因此对用户来说IE是挂起的。 是否有办法

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

问题是当我打电话时:

(new MyForm(someParam)).ShowDialog();
表单不是模态的,所以我可以点击IE窗口,它得到焦点。由于IE处于运行我的代码的中间,所以它不刷新,因此对用户来说IE是挂起的。 是否有办法确保窗体以模态方式打开,即窗体不可能隐藏在ie窗口后面

(我正在使用IE7。)


注意:这是一个类似于的问题,尽管它使用的是java。我猜解决方案是正确地传入IE窗口的iwin32窗口,所以我正在研究这个问题。

我无意回答我自己的问题,但是

似乎如果将正确的iwin32窗口传递给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;
}
感谢WindowWrapper类,尽管我希望有一种内置的方法来实现这一点


更新:这在具有保护模式的IE8上不起作用,因为它访问的HWND超出了它应该访问的范围。相反,您必须使用当前选项卡的HWND(或其他解决方案?),例如,请参阅中的.net示例以了解获取该选项卡的方法。

以下是Ryan/Rory的WindowWrapper代码的更简明版本:

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