基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理
一、前言
两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题。具体而言,他在使用CefSharp WPF版本时遇到了一个问题,即输入法突然出现在屏幕的左上角。在这里记录下处理这个问题的过程,希望能够帮助到其他遇到类似问题的开发者。让我们一起来探讨如何解决能更好的处理CefSharp WPF版本中的中文输入法显示问题。
二、WpfImeKeyboardHandler
在https://github.com/cefsharp/cefsharp 上查看了关于CefSharp的Issues,搜索IME(Input Method Editor 输入法编辑器),可以看到一些 Chinese IME相关的问题

点击第一个链接找到了一个源码关于cefsharp fix chinese IMES的提交记录

仅展示关键代码,使用方式如下:
public class CustomWebBrowser : ChromiumWebBrowser
{
public CustomWebBrowser()
{
this.WpfKeyboardHandler = new WpfImeKeyboardHandler(this);
}
}
虽然官方提供了关于WpfImeKeyboardHandler的处理方法,但在我的测试中,效果并不理想,仍然存在输入法位置偏移的情况。可能是我使用的方式不对,也有可能是官方并未覆盖某些特定情境。
如果有哪位朋友通过上述方式成功解决了中文输入法问题,不妨留言分享一下,这将对我和其他遇到相似问题的开发者都是极大的帮助。
二、CefSharp.Wpf.HwndHost
在浏览 CefSharp 仓库时,我注意到了 CefSharp.Wpf.HwndHost,并且红框中的说明引起了我的关注,特别是关于 IME支持的部分。
IME 支持可能是为了解决输入法相关的问题。

下载CefSharp.Wpf.HwndHost 仓库,运行如下:

效果来看基于HwndHost解决了输入法框偏移的问题。
与此同时使用HwndHost也会带来一些问题,如:
- 需要遵守“空域规则”,即 WPF 和 Win32 的内容必须总是使用它们自己的不同窗口区域,不能重叠或遮挡。
- 需要处理一些复杂的细节,如键盘焦点、鼠标捕获、消息泵等。
- 可能会影响 WPF 的布局和渲染,因为 Win32 窗口不是 WPF 的可视化对象,不能使用 WPF 的属性和事件。
官方的Readme如下:

翻译如下:
为那些想要本机基于Win32的实现(用于IME支持和更好的性能)的人设计的替代CefSharp.Wpf.ChromiumWebBrowser。
该控件使用HwndHost来托管本机CefBrowser实例。
与任何HwndHost为基础的控制标准空域问题适用。
- https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/wpf-and-win32-interoperation
- https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/technology-regions-overview
三、使用WindowsFormsHost承载CefSharp.WinForms
下载https://github.com/cefsharp/cefsharp 仓库,测试了CefSharp.WinForms

运行结果来看CefSharp.WinForms可以更好的支持中文输入法。
当然WPF通过WindowsFormsHost来承载Winform窗体同样也会带来以下问题:
- WindowsFormsHost同样需要遵守“空域规则”
- 需要处理一些复杂的细节,如键盘焦点、鼠标捕获、消息泵等。
- 可能会影响 WPF 的布局和渲染,不能使用 WPF 的属性和事件。
四、结尾
考虑到CefSharp.WinForms和CefSharp.WPF的接口大部分相似,我们在项目中选择使用WindowsFormsHost来承载CefSharp.WinForms,以解决中文输入法的问题。如果有哪位园友有更优的解决方案,欢迎留言分享,让我们共同解决中文输入法的问题。
五、源码地址
gitee地址:https://gitee.com/sirius_machao/mweb-browser
github地址:https://github.com/sirius-chao/MWebBrowser
项目邀请:如对该项目有兴趣,欢迎联系我共同开发!!!
基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理的更多相关文章
- 基于.net开发chrome核心浏览器
本文转载自:http://www.cnblogs.com/liulun/archive/2013/04/20/3031502.html 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一 ...
- 基于.net开发chrome核心浏览器【二】
原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...
- 基于.net开发chrome核心浏览器【七】
这是一个系列的文章,前面六篇文章的地址如下: 基于.net开发chrome核心浏览器[六] 基于.net开发chrome核心浏览器[五] 基于.net开发chrome核心浏览器[四] 基于.net开发 ...
- 基于.net开发chrome核心浏览器【四】
原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...
- 基于.net开发chrome核心浏览器【三】
原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...
- 基于.net开发chrome核心浏览器【一】
原文:基于.net开发chrome核心浏览器[一] 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送IE6浏览器的进程 世界上使用IE6浏览器最多的地方在中国 中国使用IE6 ...
- 基于.net开发chrome核心浏览器【五】
一:本篇将解决的问题 本章主要为了解决一下几个问题: 1.JsDialog的按钮错位的问题 我们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,确定和取消按钮会出现错位的情 ...
- 基于.net开发chrome核心浏览器【一】(转)
http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送I ...
- 基于.net开发chrome核心浏览器【六】
写在前面: 距离发这个系列的上一篇文章已经过去两个多月了 因为工作上不涉及这一部分的内容,兼且琐事缠身,一直无力动笔写这个系列的第六篇文章 然而,有很多朋友都关注这个系列,希望我能再写写. 写文章有人 ...
- 解决Python开发中,Pycharm中无法使用中文输入法问题
Pycharm是开发Python程序的利器,但有时会遇到无法输入中文的情况.表现为:在Ubuntu系统可以正常输入中文,却在Pycharm内写注释的时候,切换不出中文.下面演示如何解决此问题. 1.在 ...
随机推荐
- 华为云GaussDB(for openGauss)推出重磅内核新特性
摘要:华为云新一代金融级分布式数据库GaussDB(for openGauss)正式推出了Ustore存储引擎.基于Paxos协议的DCF高可用组件等多个重大内核新特性. 数字化时代,技术迭代更新比以 ...
- FusionInsight怎么帮「宇宙行」建一个好的「云数据平台」?
摘要:基于数据湖架构,应用效率得以极大提升.经过几年发展,当前集群规模已经达到1000多节点,数据量几十PB,日均处理作业数大概是10万,赋能于180多个总行应用和境内外41家分行及子公司. 本文分享 ...
- Solon2 开发之IoC,十、Bean 在容器的两层信息
1.剖析 Bean 的装包与注册过程 比如,用配置器装配一个 Bean (本质是装配出一个 BeanWrap,并自动注册到容器): @Configuration public class Config ...
- PPT 图片框架排版万能能公式
图片作用 提升设计感 辅助表达 传递情感 如何选择一张高大上的图片? 星空.地球.城市.海洋.线条.粒子.山脉.壁纸(系统.手机厂商千挑万选的) https://cn.bing.com/images ...
- 【Git】git多分支开发 git远程仓库 ssh链接远程仓库 协同开发 冲突解决 线上分支合并 pycharm操作git 远程仓库回滚
目录 昨日回顾 1 git多分支开发 分支操作 合并分支 2 git远程仓库 2.1 把路飞项目传到远程仓库(非空的) 3 ssh链接远程仓库,协同开发 4 协同开发 5 冲突解决 5.1 多人同一分 ...
- DNS--安装&&配置文件
1 下载 #下载服务yum -y install bind#下载解析工具yum -y install bind-utils 2 配置文件 主配置文件 /etc/named.conf 区配置文件 /va ...
- L2-024 部落 (25 point(s)) (并查集)
补题链接:Here 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查 ...
- freeswitch带媒体压力测试方案
概述 原本的计划是使用sipp完成带媒体压力测试,但是实际测试过程中发现sipp的媒体处理功能有问题(也有可能是我使用的姿势不对). sipp在带媒体的情况下(600路并发开始),出现大量的不响应和响 ...
- C#设计模式16——中介者模式的写法
是什么: 中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互.中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活.易于扩展和维护. 为 ...
- idea 解决git更新冲突
转载请注明出处: 对使用idea工具解决git冲突,最近有发现不同的解决冲突的方法,都很快捷方便,记录一下. 1.先commit 再pull,然后手动进行merge 左边部分是本地仓库的代码,右边部分 ...