Как я могу гарантировать, что диалог будет модальным при открытии из IE BHO? - PullRequest
1 голос
/ 24 сентября 2008

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Вот более краткая версия кода WindowWrapper Райана / Рори:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
1 голос
/ 24 сентября 2008

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

Похоже, что если вы передаете правильный 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 в этом посте , чтобы узнать, как это получить.

...