有个项目需要做个简单浏览器,从网上了解到几个相关的组件有winform自带的IE内核的WebBrowser,有第三方组件谷歌内核的webkit、cefsharp、chromiumfx等。
一开始是用的webbrowser 后来发现有些css样式是不兼容的于是又开始研究webkit这个有些css样式同样不能用,然后才开始研究cefsharp,从网上下载了57版本的但总是运行不起来后来发现装上vs中C++公共工具才行(注意即使装上vcredist_x86这个运行库也是不行),这个你不能要求人家客户装vs啊,后来也没找到到底是哪个动态库的问题。之后就下载了47版本。
按键事件
不同于webbrowser通过事件PreviewKeyDown捕获键盘按键,cefsharp是通过实现接口IKeyboardHandler赋值委托KeyboardHandler来实现的
web.KeyboardHandler = new CefKeyboardHandler(m_cell as CellControl);
public class CefKeyboardHandler : IKeyboardHandler
{
private CellControl m_cell;
/// <summary>
/// 命名代理
/// </summary>
/// <param name="con"></param>
/// <param name="text"></param>
private delegate void PreKeyEventHandler(object sender,object webBrowser,int windowsKeyCode);
public CefKeyboardHandler(CellControl cell)
{
m_cell = cell;
}
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
return true;
}
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
m_cell.Invoke(new PreKeyEventHandler(PreKeyEvent),m_cell, browserControl, windowsKeyCode);
return true;
}
private void PreKeyEvent(object sender, object webBrowser, int windowsKeyCode)
{
CellControl cell = sender as CellControl;
cell.ControlPreviewKeyDown(webBrowser , new System.Windows.Forms.PreviewKeyDownEventArgs((Keys)windowsKeyCode));
if (windowsKeyCode == (int)(Keys.Delete))
{
cell.Controls.Clear();
}
}
代理设置
公司网络是需要代理才能上外网,webbrowser可以自动获取已经设置好的代理,cefsharp网上说可以通过setting.CefCommandLineArgs.Add("--proxy-server", "http://127.0.0.1:8877");这个方式设置代理,可是不知道为啥我这边一直不行,后来发现一个通过实现接口IRequestHandler赋值委托RequestHandler来设置代理可行
webBrowser.RequestHandler = new CefRequest();
public class CefRequest : IRequestHandler
{
//
// 摘要:
// Called when the browser needs credentials from the user.
//
// 参数:
//