У меня есть вспомогательный объект браузера Internet Explorer (BHO), написанный на C#, и в разных местах я открываю формы как модальные диалоги. Иногда это работает, но в некоторых случаях нет. Случай, который я могу воспроизвести в настоящее время, - это когда IE запускает javascript для открытия других дочерних окон ... Я думаю, это где-то немного запуталось ...
Проблема в том, что когда я звоню:
(new MyForm(someParam)).ShowDialog();
форма не является модальной, поэтому я могу щелкнуть окно IE, и оно получит фокус. Поскольку IE находится в процессе выполнения моего кода, он не обновляется, и поэтому пользователю кажется, что IE завис.
Есть ли способ гарантировать, что форма будет открываться как модальная, т.е. что форма не может быть скрыта за окнами IE.
(Я использую IE7.)
NB: это вопрос, аналогичный эта почта, хотя он использует java. Я предполагаю, что решение заключается в правильном переходе в IWin32Window окна IE, поэтому я изучаю это.





Я не собирался отвечать на свой вопрос, но ...
Кажется, что если вы передадите правильный 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 в эта почта, чтобы узнать, как это сделать.
Вот более сжатая версия кода WindowWrapper Райана / Рори:
internal class WindowWrapper : IWin32Window
{
public IntPtr Handle { get; private set; }
public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}