【问题标题】:How can I ensure a dialog will be modal when opened from an IE BHO?从 IE BHO 打开时,如何确保对话框是模态的?
【发布时间】:2023-03-08 05:25:01
【问题描述】:

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

问题是当我打电话时:

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

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

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

(我使用的是 IE7。)

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

【问题讨论】:

    标签: c# internet-explorer bho


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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;
      }
      

      感谢 Ryan 的 WindowWrapper 类,虽然我希望有一个内置的方法来做到这一点?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        • 1970-01-01
        相关资源
        最近更新 更多