最近几天都被基于cefSharp封装的浏览器控件搞疯了!对于cefSharp基本满足当前所做项目的需求,但是有一个问题一直困扰我,那就是系统中偶尔会出现输入法不能转换到中文。而且这个问题似乎没有什么规律。

【项目需求】

  先说一下项目对浏览器控件的需求,如果没有需要做听音这个功能,其实项目可以是一个B/S架构。但是由于现在需要听音功能,所以决定使用C/S的架构。其中客户端采用浏览器控件来实现网页加载。客户端主窗口内嵌一个浏览器控件,然后页面有需要听音的时候可以点击听音然后弹出听音窗口。听音窗口又是由一个音频播放器+浏览器控件组成。

【最初实现】

  最初使用的是webBrowser控件,能够实现功能,但是webBrowser有太多坑,不断出现内存泄露和根据客户端IE版本进行样式渲染,HTML5兼容性差等等,诸多问题。于是痛下狠心,决定换基于webkit的浏览器控件。

【痛苦的尝试】

.Net中 基于webKit 的浏览器控件还是很多,于是做了一下各个版本的尝试:

  • webKit.Net 0.5 : 该控件内核比较老,目前最新还是2010,该控件唯一的优势是和webBrowser使用比较接近。但是项目中使用了Angularjs,在每次取数据超过100条时,速度变慢。果断pass。
  • OpenWebKitSharp :该项目是基于webKit.Net的一次封装。该控件对系统的功能能很好的满足,但是与我们的系统有一个致命的不兼容性那就是内存泄露。
  • cefSharp:基于cef1,能够满足项目的基本需求所以选择了该控件。

【输入法异常】

  选择了cefSharp后,在使用中出现一个让人崩溃的问题,那就是输入法偶尔出现不能转换到中文。而且不好定位问题出现在什么位置。裤裤折腾一周终于找到原因。

基于cefSharp1自己封装了一个浏览器控件,代码如下(有删减):

namespace XXXXXX.UserCtrol
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CefSharp.WinForms;
using CefSharp;
using System.IO; public partial class WebKitBrowser : UserControl
{
#region 字段
/// <summary>
/// webView
/// </summary>
private WebView _Core; /// <summary>
/// 网页地址
/// </summary>
private string _Url; /// <summary>
/// CEF环境设置
/// </summary>
private static Settings cefSettings;
#endregion #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
public WebKitBrowser()
: this("about:blank")
{ } /// <summary>
/// 构造函数
/// </summary>
/// <param name="url">地址</param>
public WebKitBrowser(string url)
: this(url, new BrowserSettings())
{
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="url">地址</param>
/// <param name="settings">浏览器设置</param>
public WebKitBrowser(string url, BrowserSettings settings)
{
InitializeComponent(); _Url = url;
this._Core = new WebView(url, settings); this._Core.Dock = DockStyle.Fill;
this.Controls.Add(this._Core);
BindEvents();
}
#endregion #region 方 法 #region 公有方法
/// <summary>
/// 页面导航
/// </summary>
/// <param name="url">地址</param>
public void Navigate(string url)
{
if (string.IsNullOrWhiteSpace(url))
{
this._Core.Load("about:blank");
}
else
{
this._Core.Load(url);
}
} /// <summary>
/// JS交互对象
/// </summary>
/// <param name="obj">交互对象</param>
public void ObjectForScript(object obj)
{
this._Core.RegisterJsObject("external", obj);
} /// <summary>
/// 调用JS方法
/// </summary>
/// <param name="funcName">函数名</param>
/// <param name="args">参数</param>
/// <param name="isAsync">是否异步</param>
/// <returns>返回值</returns>
public object CallJavaScriptMethod(string funcName, object[] args, bool isAsync = false)
{
StringBuilder sparam = new StringBuilder();
sparam.Append(funcName).Append("(");
if (args != null)
{
for (int i = ; i < args.Length; i++)
{
object o = args[i];
if (i > )
{
sparam.Append(",");
} if (o is string)
{
sparam.Append("\"").Append(o.ToString().Replace("\"", "'")).Append("\"");
}
else
{
sparam.Append(o);
}
}
}
sparam.Append(")");
try
{
if (isAsync)
{
this._Core.ExecuteScript(sparam.ToString());
return null;
}
else
{
return this._Core.EvaluateScript(sparam.ToString());
} }
catch (Exception ex)
{
return null;
}
} /// <summary>
/// 绑定下载控制器
/// </summary>
/// <param name="hanler">下载控制类</param>
public void BindDownLoadHandler(IRequestHandler hanler)
{
this._Core.RequestHandler = hanler;
} /// <summary>
/// 绑定快捷键菜单
/// </summary>
/// <param name="Handler">菜单控制类</param>
public void BindMenuHandler(IMenuHandler handler)
{
this._Core.MenuHandler = handler;
} /// <summary>
/// 绑定页面加载控制器
/// </summary>
/// <param name="handler">控制器</param>
public void BindLoadHandler(ILoadHandler handler)
{
this._Core.LoadHandler = handler;
} /// <summary>
/// 绑定JS弹出框控制器
/// </summary>
/// <param name="handler">控制器</param>
public void BindJSDialogHandler(IJsDialogHandler handler)
{
this._Core.JsDialogHandler = handler;
} /// <summary>
/// 资源释放
/// </summary>
public void Dispose()
{
if(this._Core !=null)
{
this._Core.Dispose();
}
} #endregion #region 私有方法
/// <summary>
/// 绑定事件
/// </summary>
private void BindEvents()
{
this._Core.LoadCompleted += new LoadCompletedEventHandler(_Core_LoadCompleted);
this._Core.PropertyChanged += new PropertyChangedEventHandler(_Core_PropertyChanged);
}
#endregion #endregion #region 事 件
/// <summary>
/// 浏览器加载完成事件
/// </summary>
public EventHandler<LoadCompletedEventArgs> DocumentCompletedEvent; /// <summary>
/// 属性改变事件
/// </summary>
public EventHandler<PropertyChangedEventArgs> DocumentPropertyChangedEvent; /// <summary>
/// 加载完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="url"></param>
private void _Core_LoadCompleted(object sender, LoadCompletedEventArgs url)
{
if (DocumentCompletedEvent != null)
{
DocumentCompletedEvent(sender, url);
}
} /// <summary>
/// 属性改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _Core_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (DocumentPropertyChangedEvent != null)
{
DocumentPropertyChangedEvent(sender, e);
}
} #endregion #region 属 性
/// <summary>
/// 获取浏览器地址
/// </summary>
public string Url
{
get { return this._Url; }
} /// <summary>
/// tooltip内容
/// </summary>
public string TooltipText
{
get { return this._Core.TooltipText; }
set { this._Core.TooltipText = value; }
}
#endregion }
}

主窗口使用了该控件,听音窗口同样使用了该控件。

【异常规律】

  在不断测试使用系统中发现,输入法只有在win7下出现异常,在Xp系统下正常。且出现输入法失败,基本都是在打开听音窗口后关闭窗口系统就出现输入法异常。而关闭子窗口调用了自己封装的Dispose()方法,及:

/// <summary>
/// 资源释放
/// </summary>
public void Dispose()
{
if(this._Core !=null)
{
this._Core.Dispose();
}
}

去除该代码后。关闭听音窗口调用控件自带Dispose()方法,异常解决。O(∩_∩)O~

  至于显示释放资源为什么在win7系统下就出现异常,还需去看看WebView 的Dispose()方法到底释放了什么资源,导致输入法出错,也希望群里面大牛知道的告诉一下。

记录一次cefsharp1输入法在win7下异常解决定位的更多相关文章

  1. win7下如何解决对方可以ping通我,但我ping不通对方问题

    以下是在百度经验里面找到的文章:http://jingyan.baidu.com/article/6b97984da3ac851ca2b0bfe1.html 当我在虚拟机的linux系统中ping本机 ...

  2. ObReferenceObjectByName函数调用WIN7下的解决

    <寒江独钓 Windows内核安全编程>第4章键盘的过滤ctrl2cap代码中,ObReferenceObjectByName函数调用: [1]extern POBJECT_TYPE Io ...

  3. win7下如何解决协议适配器错误问题

    数据库为oracle 11g,在cmd中使用sqlplus命令出现了“协议适配器错误”. 原因分析:oracle相关服务没有启动. 解决办法如下: step1:进入服务页面. 方法一:cmd → se ...

  4. 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)

    由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...

  5. win7下IIS的安装和配置 图文教程

    转自   http://www.jb51.net/article/29787.htm 最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的 ...

  6. 自己瞎捣腾的Win7下Linux安装之路-----理论篇

    接着上回说道,我把双系统做好啦,开心.... 之后我就在想几个问题: 1.在Ubuntu装好后,重启电脑却还是win7,等我用EasyBCD之后,才可选择使用装好的Ubuntu呢? 2.在用EasyB ...

  7. 自己瞎捣腾的Win7下Linux安装之路-----图例篇

    写在前面 网上很多这方面的教程,我也是参考他们的文章和一些书籍才弄成功.没啥创新性,只为记录下来,以供自已理解和以后复习. 所谓工欲善其事,必先利其器.俺想学习Linux,当然是要先装一个Linux( ...

  8. 64位WIN7下安装MPICH2

    1.首先,下载32位的MPICH2,(注意哦,是32位,不是64位) http://202.117.4.228/files/B117000000042632/www.mcs.anl.gov/resea ...

  9. win7下 mysql主从配置实现

    win7下学习 mysql主从复制 一.环境: 主服务器(master):192.168.1.23 mysql版本:5.5 从服务器(slave):192.168.1.24 mysql版本:5.5   ...

随机推荐

  1. 307. Range Sum Query - Mutable

    题目: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclu ...

  2. 120条Photoshop新手必看技巧

    Photoshop越来越强大了!试图掌控它的全部特性是不现实的(更何况有那么多隐藏的功能!),那么我们不妨收藏一下大神们总结的这120个PS技巧,偶尔翻看一下,让自己的设计更强大更高效! 这120款技 ...

  3. ubuntu下安装与测试mysql

    1.在决定安装mysql之前,要先确定系统是否已经安装mysql. 输入: 1 mysql 结果:说明尚未安装mysql The program 'mysql' is currently notins ...

  4. eclipse 中使用tomcat

    最近写了个商品搜索模块,要做成tomcat服务,以前只关注算法,从来没有使用过tomcat,这次上网上查了些资料还搞定(小公司真是锻炼人啊,以前我从来不考虑这些服务问题). 1.tomcat 环境的搭 ...

  5. 基于webpivottable做的透视表

    1.绑定数据和配置: var wptConfig=<%= wptConfig%>; webPivotTable.setCsvData(<%=dataFields %>, < ...

  6. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  7. JSP或HTML命名规范

    1.jsp与html文件名全部小写 2.数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”或者其他的单词.例如:news_message.ht ...

  8. SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    直接看代码吧,注释都在里面 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web-ap ...

  9. 【AStar】初赛第一场

    1. All X1.1 基本思路k和c的范围都不大,因此可以考虑迭代找循环节,然后求余数,判定是否相等.这题还是挺简单的.1.2 代码 /* 5690 */ #include <iostream ...

  10. URAL1204. Idempotents(扩展欧几里得)

    1204 大体推推 会出来这个式子 x(x-1) = k*n;n = p*q ;x(x-1)%(p*q)==0; 因为p,q都为素数 那也就是说x和x-1中必定包含这两个数 而且一个里面只能有一个 不 ...