5

WebBrowser コントロールを持つ .NET 3.5 を使用して、Visual Studio 2008 に Windows フォームがあります。リクエストが送信される前に、Navigating イベント ハンドラでフォームの PostData を分析する必要があります。それに到達する方法はありますか?

古い win32 ブラウザー コントロールには、引数の 1 つとして PostData を持つ Before_Navigate イベントがありました。新しい .NET WebBrowser コントロールではそうではありません。

4

2 に答える 2

8

C# バージョン

    /// <summary>
    /// Fires before navigation occurs in the given object (on either a window or frameset element).
    /// </summary>
    /// <param name="pDisp">Object that evaluates to the top level or frame WebBrowser object corresponding to the navigation.</param>
    /// <param name="url">String expression that evaluates to the URL to which the browser is navigating.</param>
    /// <param name="Flags">Reserved. Set to zero.</param>
    /// <param name="TargetFrameName">String expression that evaluates to the name of the frame in which the resource will be displayed, or Null if no named frame is targeted for the resource.</param>
    /// <param name="PostData">Data to send to the server if the HTTP POST transaction is being used.</param>
    /// <param name="Headers">Value that specifies the additional HTTP headers to send to the server (HTTP URLs only). The headers can specify such things as the action required of the server, the type of data being passed to the server, or a status code.</param>
    /// <param name="Cancel">Boolean value that the container can set to True to cancel the navigation operation, or to False to allow it to proceed.</param>
    private delegate void BeforeNavigate2(object pDisp, ref dynamic url, ref dynamic Flags, ref dynamic TargetFrameName, ref dynamic PostData, ref dynamic Headers, ref bool Cancel);

    private void Form1_Load(object sender, EventArgs e)
    {
        dynamic d = webBrowser1.ActiveXInstance;

        d.BeforeNavigate2 += new BeforeNavigate2((object pDisp,
            ref dynamic url,
            ref dynamic Flags,
            ref dynamic TargetFrameName,
            ref dynamic PostData,
            ref dynamic Headers,
            ref bool Cancel) => {

            // Do something with PostData
        });
    }


C# WPF バージョン

上記を保持しますが、次のように置き換えます。

    dynamic d = webBrowser1.ActiveXInstance;

と:

    using System.Reflection;
    ...
    PropertyInfo prop = typeof(System.Windows.Controls.WebBrowser).GetProperty("ActiveXInstance", BindingFlags.NonPublic | BindingFlags.Instance);
    MethodInfo getter = prop.GetGetMethod(true);
    dynamic d = getter.Invoke(webBrowser1, null);
于 2012-08-17T08:22:38.057 に答える
6

その機能は、.NET WebBrowser コントロールによって公開されません。幸いなことに、そのコントロールはほとんどが「古い」コントロールのラッパーです。これは、(プロジェクトに SHDocVw への参照を追加した後) 次のようなものを使用して、あなたが知っていて愛する (?) BeforeNavigate2 イベントにサブスクライブできることを意味します。

Dim ie = DirectCast(WebBrowser1.ActiveXInstance, SHDocVw.InternetExplorer)
AddHandler ie.BeforeNavigate2, AddressOf WebBrowser_BeforeNavigate2

...そして、そのイベント内の PostData に対して必要なことを行います。

Private Sub WebBrowser_BeforeNavigate2(ByVal pDisp As Object, ByRef URL As Object, _
       ByRef Flags As Object, ByRef TargetFrameName As Object, _
       ByRef PostData As Object, ByRef Headers As Object, ByRef Cancel As Boolean)
    Dim PostDataText = System.Text.Encoding.ASCII.GetString(PostData)
End Sub

1 つの重要な注意点: WebBrowser.ActiveXInstance プロパティのドキュメントには、「この API は .NET Framework インフラストラクチャをサポートしており、コードから直接使用することは意図されていません。」と記載されています。つまり、プロパティを使用すると、将来の任意の時点でアプリが壊れる可能性があります。たとえば、フレームワークの人々が、既存の SHDocVw COM コンポーネントをラップする代わりに、独自のブラウザー コンポーネントを実装することを決定した場合などです。

したがって、このコードを多くの人に出荷するものや、多くのフレームワークバージョンが来ても機能し続ける必要があるものには入れたくないでしょう...

于 2008-09-27T20:03:47.737 に答える