1

WebBrowser コントロールを使用する WPF アプリを作成しています。
私はいくつかの点で苦労しています:

  1. コントロールからダウンロードの現在の進行状況を取得する方法。WinForms WebBrowser コントロールは ProgressChange イベントを発生させます - この機能を WPF バリアントで複製するにはどうすればよいですか?

  2. 新しいウィンドウで開こうとしているリンクをキャプチャする方法。ここでも、Winforms WebBrowser に NewWindow イベントがありました。これを使用して、IE の起動を停止し、同じウィンドウでリンクを開くことができます。WPFバリアントでこれを行うことは可能ですか?

4

2 に答える 2

3

インターフェイスを取得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 ブラウザー オブジェクトを保持しますが、これは「内部」であるため、リフレクションによって取得できます。

于 2014-04-22T10:56:29.757 に答える
3

必要な情報を見つけたので、興味のある人のためにこの質問を更新すると思いました。

http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser(v=VS.90).aspxの下部に、「ネイティブ IWebBrowser2 へのアクセス」というタイトルのコメントがあります。

これは、必要なインターフェースに到達する方法を示しており、うまく機能しているようです。

編集:MSDNのコメントが消え続けるので、ここにリンクのコンテンツを追加します..

マネージ ラッパーがまだ公開していないネイティブ Web ブラウザー コントロールの機能が多数あります。次のコード スニペットは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 は対話の準備ができています。

次のように、生成されたマネージド ラッパーを介して、ネイティブ Web ブラウザーのイベント ( 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.
}
于 2010-01-14T14:53:07.330 に答える