Как я могу гарантировать, что диалог будет модальным при открытии из IE BHO?

Asked
Viewd1061

1

У меня есть вспомогательный объект браузера Internet Explorer (BHO), написанный на C #, и в различных местах я открываю формы как модальные диалоги. Иногда это работает, но в некоторых случаях нет. Случай, который я могу воспроизвести в настоящее время, - это когда IE запускает javascript, чтобы открывать другие дочерние окна ... Я думаю, это где-то немного запуталось ....

Проблема в том, что когда я звоню:

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

форма не является модальной, поэтому я могу щелкнуть окно IE, и оно получит фокус. Поскольку IE находится в процессе выполнения моего кода, он не обновляется, и поэтому пользователю кажется, что IE завис.

Есть ли способ гарантировать, что форма будет открываться как модальная, т. е. что форма не может быть скрыта за окнами IE.

(Я использую IE7.)

Обратите внимание: это вопрос, аналогичный этот пост , хотя в нем используется java. Я предполагаю, что решение заключается в правильном переходе в IWin32Window окна IE, поэтому я изучаю это.

2 ответов

1

Я не собирался отвечать на свой вопрос, но ...

Похоже, что если передать правильный IWin32Window методу ShowDialog (), он будет работать нормально. Уловка в том, как это получить. Вот как я это сделал, где siteObject - это объект, переданный методу SetSite () BHO:

 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 в опубликовать , чтобы узнать об этом.