最近几天都被基于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 = 0; i < args.Length; i++){object o = args[i];if (i > 0){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()方法到底释放了什么资源,导致输入法出错,也希望群里面大牛知道的告诉一下。

转载于:https://www.cnblogs.com/ITCommunication/p/4063479.html

记录一次cefsharp1输入法在win7下异常解决定位相关推荐

  1. Linux Mint 19.1 配置开发环境记录【含:输入法安装、字体模糊解决等问题】

    PS:本教程是在物理机上配置好之后,在VMware虚拟机中再次模拟该过程,作为记录,以便保存折腾过程. 1. 为什么要使用 Linux 进行开发? 关于这个问题的回答,网上有很多大神优秀的回答,大家可 ...

  2. DELL XPS 9350 无线网卡DW1820A WIN7驱动异常解决

    电脑型号:戴尔XPS 13 9350 故障现象: 安装完其他驱动都正常,打上官网的无线蓝牙一体驱动,只能驱动蓝牙,无线网卡无法驱动 故障解决: 开机F2,到Wireless选项现将蓝牙功能关闭,保存重 ...

  3. 教你win7下如何删除微软拼音输入法~!

    win7下安装Office 2003以上版本时,会自带微软拼音输入法,无法屏蔽,无法删除. 小妙招:不需要借助第三方软件,也不要在注册表里找,也不要麻烦的去文件夹里去找,可以删掉讨厌的微软拼音输入法. ...

  4. Win7下微软拼音等中文输入法默认英文标点解决办法

    win7下中文输入法默认标点是英文,很不爽.用下面的方法可以解决. 1. 创建"EN 英文美国"-->键盘-->美式键盘: 2. 将上一步中创建的"英文(美国 ...

  5. arduinowin7_Arduino在64位WIN7下无法安装驱动的解决办法

    本人购买Arduino UNO R3连接在64位WIN7下,安装官方驱动后显示如下图错误: 硬件列表显示未知设备,如下图: 多次反复安装仍无法识别,在网上搜索都说是精简版的Win7 ghost删除了大 ...

  6. Win7下安装ubuntu (双硬盘用户加强版)

    起源还是学习上要用到linux操作系统,所以才在自己电脑上安装linux操作系统.先开始是在虚拟机上用的,但用过一两星期就感觉还是不适合,用虚拟机感觉只要ctrl+Alt就能退出来,给自己留了太多的退 ...

  7. win7下计划任务schtasks使用详解及错误:无法加载列资源的解决方法1

    win7下计划任务schtasks使用详解及"错误:无法加载列资源"的解决方法1 2011-12-10 20:33 schtasks 命令简述: 安排命令和程序,使其定期运行或在指 ...

  8. win7下python的安装与配置_Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程...

    以此文记录Python与Tensorflow及其开发环境的安装与配置过程,以备以后参考. 1 硬件与系统条件 Win7 64位系统,显卡为NVIDIA GeforeGT 635M 2 安装策略 a.由 ...

  9. Win7下快速预览各种类型的文本文件

    win7下的快速预览功能,给我们带来了不少便捷.但它只能预览指定的或者有预览处理器的文件.一般情况下.我们的源码都是文本类型的.但win7默认只支持txt文件的预览.我们要想快速的预览下各种编程语言源 ...

最新文章

  1. awl 多线程SYN***工具0.2版,加了MAC伪装
  2. Linux_ServicesManagement_RHEL7
  3. linux命令行颜色
  4. 2021-03-15 final value theorem 终值定理
  5. 深度学习笔记之DenseNets
  6. StarUML3.0.2——超好用的UML画图工具推荐
  7. java实习每周总结
  8. 模拟斗地主洗牌发牌,并对已发好的拍进行排序(红桃A,方块A, 黑桃2.......)
  9. ywq_app后台分析
  10. 停止dockerd进程
  11. Unity3d将资源打包成AssetBundle 读取后材质球丢失的问题
  12. 求两个数的最大公约数,Euclid算法证明,以及C语言代码实现
  13. 颜色空间:RGB,CMY,HSV,HSL,Lab详解
  14. IDEA设置一键导包
  15. 2019吉大软件C++课设——模拟即时通信系统
  16. 我为什么放弃Pocket使用Pinbox来整理收藏碎片化知识
  17. LaTeX BibTeX的使用
  18. 怎么解除计算机网络密码,电脑怎么解除密码
  19. HashMap源码逐行分析
  20. Ubuntu 上下左右键变成ABCD

热门文章

  1. IBM AIX JFS 数据恢复记录(暂)
  2. STM32中关于串口通信的printf()函数重定向问题
  3. TinyOS下TOSSIM仿真
  4. 从源码分析DEARGUI之键盘鼠标事件监控
  5. JAVA学习笔记(2)—— java初始化三个原则
  6. 新OpenSUSE的树莓派镜像
  7. 【加密解密】单表加密(Javascript实现)
  8. linux系统编程:线程原语
  9. Elasticsearch教程-从入门到精通
  10. Zend Guard6.0使用教程——PHP代码加密