1

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

问题是当我打电话时:

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

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

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

(我使用的是 IE7。)

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

4

2 回答 2

2

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

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
于 2010-02-26T13:37:35.430 回答
1

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

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

于 2008-09-24T12:57:49.730 回答