У меня есть форма с экземпляром WebBrowser на ней. В него загружается страница сайта, на которой есть ссылка вида '<a onClick="self.close();">Закрыть окно</a>'. При нажатии ее выдает сообщение, что скрипты пытается закрыть WebBrowser. Если согласиться, то WebBrowser просто зависает. Поэтому стоит задача перехватить и отменить это закрытие.
После гугления нашел следующее решение. Расширить класс WebBrowser, чтобы перегрузить метод 'WndProc()', чтобы он ловил событие WM_PARENTNOTIFY, в котором передается WM_DESTROY. Однако, решение было предназначено для организации корректного закрытия формы браузера. В моем же случае мне нужно отменить закрытие и перейти по конкретному URL. Мне удается перехватить WM_DESTROY, но WebBrowser все равно убивается и зависает. Код использованного решения ниже:
public class ExtendedWebBrowser : WebBrowser
{
// Define constants from winuser.h
private const int WM_PARENTNOTIFY = 0x210;
private const int WM_DESTROY = 2;
public string BackUrl { get; set; };
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PARENTNOTIFY:
if (!DesignMode)
{
if (m.WParam.ToInt32() == WM_DESTROY)
{
Navigate(BackUrl);
}
}
DefWndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
}
Вопрос: Как предотвратить дальнейшую обработку WM_DESTROY или WM_CLOSE?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей