C# - Отменить закрытие WebBrowser перехватом WM_DESTROY или WM_CLOSE

275
03 мая 2018, 06:45

У меня есть форма с экземпляром 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?

READ ALSO
Связь между UseControl

Связь между UseControl

Доброе утро, вечер, деньМой вопрос заключается в том, как связать эллипсы на разных Usecontrol

255
LINQ Запрос по Dictionary с битовой маской

LINQ Запрос по Dictionary с битовой маской

Помогите, пожалуйста, решить задачкуДано:

257
Как выполнять task в отдельном потоке?

Как выполнять task в отдельном потоке?

Есть метод, который читает журнал событий:

235
Собрать универсальное C# приложение

Собрать универсальное C# приложение

Недавно сделал для себя открытие - при сборкеNET-приложения я могу выбрать разрядность целевой платформы

214