WPF WebBrowser: как получить доступ к прогрессу и новым событиям окна - PullRequest
1 голос
/ 14 января 2010

Я создаю приложение WPF, которое использует элемент управления WebBrowser.
Я борюсь за пару моментов:

  1. Как получить текущий прогресс загрузки из элемента управления. Элемент управления WinForms WebBrowser вызывает события ProgressChange - как мне воспроизвести эту функцию с вариантом WPF?

  2. Как перехватить ссылки, которые пытаются открыть в новом окне. Снова в Winforms WebBrowser было событие NewWindow. Я мог бы использовать это, чтобы остановить запуск IE и открыть ссылку в том же окне. Можно ли сделать это с вариантом WPF?

Ответы [ 2 ]

3 голосов
/ 14 января 2010

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

Внизу http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser(v=VS.90).aspx есть комментарий под названием «Как добраться до родного IWebBrowser2».

Это показывает, как добраться до требуемого интерфейса и, кажется, работает хорошо.

РЕДАКТИРОВАТЬ : Добавление содержания ссылки здесь, поскольку комментарии на MSDN продолжают исчезать на меня ..

Существует много функциональных возможностей встроенного элемента управления веб-браузера, которые наша управляемая оболочка еще не раскрывает. В следующем фрагменте кода показано, как получить интерфейс IWebBrowser2 из элемента управления WPF WebBrowser. Это позволяет получить доступ к методам объекта, которые не доступны другим образом для элемента управления. Однако обратите внимание, что этот пример кода будет работать только в полностью доверенном коде.

Во-первых, см. Документацию IWebBrowser2 здесь: http://msdn.microsoft.com/en-us/library/aa752127.aspx ...

Чтобы скомпилировать этот код, добавьте ссылку на COM к System32\shdocvw.dll или ieframe.dll (в зависимости от версии IE).

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
internal interface IServiceProvider
{
    [return: MarshalAs(UnmanagedType.IUnknown)]
    object QueryService(ref Guid guidService, ref Guid riid);
}

static readonly Guid SID_SWebBrowserApp = 
      new Guid("0002DF05-0000-0000-C000-000000000046");

// ...

IServiceProvider serviceProvider = (IServiceProvider)myWebBrowser.Document;
Guid serviceGuid = SID_SWebBrowserApp;

Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;

SHDocVw.IWebBrowser2 myWebBrowser2 = 
  (SHDocVw.IWebBrowser2) serviceProvider.QueryService(ref serviceGuid, ref iid);

И тогда myWebBrowser2 готов к взаимодействию.

Вы также можете обрабатывать события собственного веб-браузера (http://msdn.microsoft.com/en-us/library/aa768309(VS.85).aspx) через сгенерированные управляемые оболочки, например:

SHDocVw.DWebBrowserEvents_Event wbEvents = (SHDocVw.DWebBrowserEvents_Event)myWebBrowser2;
wbEvents.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(OnWebBrowserNewWindow);

void OnWebBrowserNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
    // Set Processed to cancel opening of the new window.
}
2 голосов
/ 22 апреля 2014

Чтобы получить IWebBrowser2 интерфейс, есть простой способ:

//The "browser" is a object of WebBrowser class.
SHDocVw.IWebBrowser2 axBrowser = typeof(WebBrowser).GetProperty("AxIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(browser, null) as SHDocVw.IWebBrowser2;

((SHDocVw.DWebBrowserEvents_Event)axBrowser).NewWindow += OnWebBrowserNewWindow;

private void OnWebBrowserNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
        {
            Processed = true;
            browser.Navigate(URL);
        }

Класс WebBrowser имеет свойство AxIWebBrowser2 и содержит базовый объект браузера COM, но он «внутренний», поэтому мы можем получить его по отражению.

...