之前用WebBrowser,打开网页很卡,但因为并是太要求速度和体验,所以可以显示html就可以了。但是,现在要求显示速度,最主要问题是WebBrowser控件的UserAgent,其实并不完全是IE(之前大家都以为是),而是7.0,有一个办法可以在注册表中修改,修改为10.0,但是在测试网站,如:http://whatsmyua.com/ ,显示的是WebBrowser,而不是IE10。应该是这个问题,使很多网站都会提示,版本太低或不支持这款浏览器,这样没办法正常显示,虽然只有少部分,但遇到关键的网站干着急。
找到CefSharp这个开发包,下载了源码和执行文件,速度比WebBrowser要快不卡了,而且有错误提示的网站也都正常显示了。但在分析源码时,遇到一些问题,由于独自研究耽搁一天多,以后也可能还会遇到,在此总结下。
源码分为几个工程,有WinForm和Wpf两种演示,虽然我很喜也更善长Wpf,但因为软件效率的原因,还是只看WinForm,有支持的VC托管工程CefSharp和CefSharp.WinForms,另外有mvc方式的示例c#工程CefSharp.Example,执行文件依赖的是CefSharp.dll和CefSharp.WinForms.dll。另外,需要加入icudt.dll和libcef.dll,生成操作设置无,输出设为新复制,因为CefSharp.dll需要,否则将会报错。另外,CefSharp是x86编辑,需要修改使用的工程属性在编译目标设置为x86,否则有编译警告。
将locales及其下所有都设置为输出,里面有个en-US.pak文件,如没有,则应用程序会启动显示错误退出。
再将devtools_resources.pak 设置为输出,否则调用devtools时将报错不能打开。(常见问题官网解释)
还有一个非常奇怪没能解决的问题,想封装WebView(CefSharp.WinForms.dll实现的浏览器类),到一个UserControl,但如果拖放这个控件到其它控件上或窗体上,则会报文件找不到CefSharp.dll或其依赖项,Reflector也没能找到到底是缺了什么。只要是在userControl引用WebView的实例就会报错,只能使用反射建立的办法迂回建立了。谁知道原因和办法,请发给我:)
上面说的CefSharp.Example定义了一个绕的方案的解决控制与视图间的关联,这样真的耦合低么,但我的需求很简单,就是按WebBrowser的设计封装一个相同方法的类,用来替换它。但后来发现,确实有必要,因为Cef的结构很繁杂,可能是功能多的原因吧。
IWebBrowser 有XXXXXHandle属性,用来控制浏览器的运行。之前我需要的不打开新窗口,只转向,需要实现ILifeSpanHandler,然后返回true证明处理了。
Cef分为系统初始化和设置参数,还有BrowserView的参数设置。更多的控制需要详看CefSharp.Example,我仔细看过,没什么不理解处。至于前面的VC工程实在没有细看的耐心了,暂时不需要。
c++和c#联合编成 使用webBrowser在网页中插入js脚本并执行 一个ISchemeHandler例子 用javascript获取图片颜色