Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: WebBrowser, фреймы и открытие в новой вкладке  (Прочитано 8971 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 19-09-2010 19:31 » 

Здравствуйте.

Существует очень большая проблема и она не даёт мне покоя. Итак:

Есть TabControl с WebBrowser'ом на каждой закладке. При открытии окон в том же окне- всё ок, но когда окно открывается в новом (открыть в новой вкладке), то тут начинаются большие проблемы. Кое-как решил этот вопрос следующим кодом:

Код:
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElementCollection links = this.webBrowser1.Document.Links;
            foreach (HtmlElement var in links)
            {
                var.AttachEventHandler("onclick", LinkClicked);
            }
        }

        private void LinkClicked(object sender, EventArgs e)
        {
            HtmlElement link = this.webBrowser1.Document.ActiveElement;
            url = link.GetAttribute("href");
        }

        private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            //Prevent new window being opened in IE.
            e.Cancel = true;
            OpenLinkInOwnWindow w = new OpenLinkInOwnWindow();
            w.Show();
            w.Navigate(url);
        }

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

Теперь оказывается существует ещё способ открытия нового окна через JavaScript на всевозможных элементах (картинки, кнопки и т.д.)- это вообще беда...

Вопрос: Неужели нельзя абстрагироваться от всех этих условий и отлавливания каждого чиха и пыха и где-то получить адрес страницы, которая должна открываться в новом окне и уже её открывать у себя в новой вкладке?

Вопрос очень важный и серьёзный для меня, если чем-то смогу помочь- помогу. Спасибо.
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 19-09-2010 20:22 » 

Не знаю как это делается в Net. На уровне интерфейсов надо смотреть в сторону метода DWebBrowserEvents2::NewWindow2(     IDispatch **ppDisp,  VARIANT_BOOL *Cancel);
Данное событие возникает всякий раз при создании нового окна. Тебе только надо при возникновении данного события создать свою закладку WebBrowser или взять текущую, в обработчике данного события, в параметр события ppDisp подставить указатель на интерфейс IDispatch своего WebBrowser.
Или другой вариант, правда он кривой - использовать DWebBrowserEvents2::NewWindow3(IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl); Здесь можно использовать параметры bstrUrlContext, bstrUrl. Но данный способ не учитывает POST-запросы.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 20-09-2010 06:06 » 

zubr, через marshalling прицепиться к COM-объекту и вперёд.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-09-2010 07:19 » 

Кажется 95% проблем решились следующим образом:

Код:
private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{

    webBrowser1.Navigate(webBrowser1.StatusText);
    e.Cancel = true;
}

Остался последний штрих- открыть окно у себя в веббраузере, когда вызов идет следующим образом:

Код:
onclick="window.open('register.php?edit=1', '1d', 'height=500,width=800,location=yes,menubar=yes,status=yes,toolbar=yes,scrollbars=yes')"

 Здесь была моя ладья...
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-09-2010 08:27 » 

up Жаль
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #5 : 21-09-2010 09:42 » 

FallenSoul, еще раз повторяю - универсальное решение - это перехват события DWebBrowserEvents2::NewWindow2 с подстановкой указателя на интерфейс своего WebBrowser.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines