C#WebBrowser - 帮助添加标志以导航方法

时间:2015-08-17 00:52:32

标签: c# .net winforms com

我对COM对象不是最好的,但我需要扩展WebBrowser控件以支持导航方法中的标志(特别是为了防止从缓存中读取/写入)。

从我收集到的内容中,我需要在某种程度上实现IWebBrowser2。我可以只实现Navigate方法,还是需要在界面中定义所有方法?

我找到了一些附加/分离事件接收器以扩展Web浏览器事件的示例,但实际方法却很少。

我可以使用WebBrowser控件的下划线ActiveXInstance吗?如果我创建一个实现IWebBrowser2 :: Navigate的类,并将变量强制转换为该类,则分配WebBrowser控件ActiveXInstance然后尝试导航我得到一个COM异常HRESULT E_FAIL

我发现了这个,但不确定基础控件是否仍然是ShDocVw,因为我没有在我的COM对象中看到它(目标FW .Net 3.5):Web Browser to handle pop ups within the application

internal ShDocVw.WebBrowser ActiveXWebBrowser { get; private set; }`

new public void Navigate(string url)
{
    this.Navigate(url, axNativeMethods.WebBrowserNavigateFlags.NoReadFromCache | axNativeMethods.WebBrowserNavigateFlags.NoWriteToCache, string.Empty, new byte[] { }, string.Empty);
}

public void Navigate(string url, axNativeMethods.WebBrowserNavigateFlags flags, string targetFrameName, byte[] postData, string headers)
{

    this.ActiveXWebBrowser = (ShDocVw.WebBrowser)this.ActiveXInstance;`

    object flagsObj = (flags == axNativeMethods.WebBrowserNavigateFlags.None) ? null : (object)flags;
    object targetFrameNameObj = targetFrameName;
    object headersObj = headers;
    object postDataObj = postData;

    ActiveXWebBrowser.Navigate(url, ref flagsObj, ref targetFrameNameObj, ref postDataObj, ref headersObj);
}

1 个答案:

答案 0 :(得分:0)

这是extension methods的完美用例。基本上,它们允许您在静态类中定义出现的方法,以直接绑定到要扩展的类型,并且其行为与该类型上的公共实例方法非常相似,只有公共或内部(在友元程序集或扩展类和扩展类在同一程序集中的情况下可用。

以下是一个示例代码段:

public static class WebBrowserExtensions
{
    public static void Navigate(this IWebBrowser2 browser, string url)
    {
        browser.Navigate(url, /* fill in arguments as necessary*/)
    }
}