我有一个用c#编写的Internet Explorer浏览器帮助程序对象(BHO),在各个地方我打开表单作为模态对话框。有时它会起作用,但在某些情况下它不起作用。我目前可以复制的情况是IE正在运行javascript以打开其他子窗口...我猜它在某处有点混淆....

问题在于我打电话时:

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

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

有没有办法确保将表单打开为模态,即表单不可能隐藏在IE窗口后面。

(我正在使用IE7。)

注意:这是一个类似的问题这篇文章虽然那是使用java。我想解决方案是正确传递IE窗口的IWin32Window,所以我正在调查。

有帮助吗?

解决方案 2

我不打算回答我自己的问题,但是......

似乎如果你将正确的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;
}

感谢WindowWrapper课程的 Ryan ,尽管我希望有一种内置的方法可以做到这一点吗?

更新:这在具有保护模式的IE8上不起作用,因为它正在访问应该是的HWND。相反,你将不得不使用当前标签的HWND(或其他一些解决方案?),例如,请参阅这个中的.net示例发布以获得这种方式。

其他提示

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

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top