繁体   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