3

メソッドからのアイデアに従って、WebBrowser独自の実装を持つコントロールから派生コントロールを作成しました。IDocHostUIHandlerCreateWebBrowserSiteBase

WebBrowser.WebBrowserSiteクラスは、OLEIDocHostUIHandlerインターフェースのデフォルトの実装を提供します。コントロールの動作をカスタマイズするために、このインターフェイスの独自の実装を提供するか、他のWebBrowserActiveXコントロールインターフェイスを実装できます。

動作していない問題。私のコードは次のように見えます:

[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
public MyBrowser(){}

protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
    var manager = new NewWebBrowserSite(this);
    return manager;
}

protected class NewWebBrowserSite : WebBrowserSite, 
    UnsafeNativeMethods.IDocHostUIHandler
{
    private MyBrowser host;
    public NewWebBrowserSite(MyBrowser h)
        : base(h)
    {
        this.host = h; 
    }

    int UnsafeNativeMethods.IDocHostUIHandler.ShowContextMenu(int dwID, NativeMethods.POINT pt, object pcmdtReserved, object pdispReserved)
    {
        MyBrowser wb = (MyBrowser)this.host;
        // other code
    }

    // rest of IDocHostUIHandler methods
}

私の質問は次のとおりです。

  1. それを機能させるために他のインターフェースを実装する必要がありますか?
  2. それは設計によるものですか、私はそれが.netフレームワークの実装のバグに関連しているといういくつかの投稿を読みましたWebBrowser

私はそれがうまくICustomDoc.SetUIHandlerいく可能性があることを知っていますが、それは私が探しているものではありません。

私はある時点でc#をあきらめて、アンマネージコードでそれを行うことを考えていました。そうですか?

4

2 に答える 2

4

私はまったく同じ問題に対処しましIDocHostUIHandlerた。WinFormsWebBrowserコントロールにカスタム実装を提供する方法です。問題は、基本クラスWebBrowserSiteがすでに独自のバージョンのを実装していることですIDocHostUIHandler(これはinternalインターフェースであるため、派生クラスで明示的に再実装NewWebBrowserSiteすることはできません)。ただし、理論的には、同じGIIDとメソッドレイアウトを使用して別のC#インターフェイスを実装することは問題ではありません(この特定のケースでは、すべてのCOMクライアント(基盤となるWebBrowser ActiveXコントロール)が問題になるため)。

残念ながら、それは.NET4.0まで不可能でした。幸いなことに、新しいICustomQueryInterface機能によって次のようになりました。

protected class NewWebBrowserSite : WebBrowserSite, 
    UnsafeNativeMethods.IDocHostUIHandler
    ICustomQueryInterface
{
    private MyBrowser host;
    public NewWebBrowserSite(MyBrowser h): base(h)
    {
        this.host = h; 
    }

    int UnsafeNativeMethods.IDocHostUIHandler.ShowContextMenu(int dwID, NativeMethods.POINT pt, object pcmdtReserved, object pdispReserved)
    {
        MyBrowser wb = (MyBrowser)this.host;
        // other code
    }

    // rest of IDocHostUIHandler methods

    // ICustomQueryInterface

    public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
    {
        if (iid == typeof(UnsafeNativeMethods.IDocHostUIHandler).GUID)
        {
            ppv = Marshal.GetComInterfaceForObject(this, typeof(UnsafeNativeMethods.IDocHostUIHandler), CustomQueryInterfaceMode.Ignore);
        }
        else
        {
            ppv = IntPtr.Zero;
            return CustomQueryInterfaceResult.NotHandled;
        }
        return CustomQueryInterfaceResult.Handled;
    }   
}
于 2013-10-30T13:48:12.513 に答える
1

クラスによって実装されたインターフェースを単純にオーバーライドすることはできません。IDocHostUIHandlerのメソッドが仮想としてマークされていない場合、それらを置き換えることはできません。

インターフェイスがで定義されているという事実は、UnsafeNativeMethods自分が何をしているのかについて非常に良い考えがない限り、おそらくそれをいじってはいけないという手がかりでもあります。

于 2013-03-20T04:57:43.187 に答える