一、前言

两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题。具体而言,他在使用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为基础的控制标准空域问题适用。

三、使用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中文输入法偏移处理的更多相关文章

  1. 基于.net开发chrome核心浏览器

    本文转载自:http://www.cnblogs.com/liulun/archive/2013/04/20/3031502.html 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一 ...

  2. 基于.net开发chrome核心浏览器【二】

    原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...

  3. 基于.net开发chrome核心浏览器【七】

    这是一个系列的文章,前面六篇文章的地址如下: 基于.net开发chrome核心浏览器[六] 基于.net开发chrome核心浏览器[五] 基于.net开发chrome核心浏览器[四] 基于.net开发 ...

  4. 基于.net开发chrome核心浏览器【四】

    原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...

  5. 基于.net开发chrome核心浏览器【三】

    原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...

  6. 基于.net开发chrome核心浏览器【一】

    原文:基于.net开发chrome核心浏览器[一] 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送IE6浏览器的进程 世界上使用IE6浏览器最多的地方在中国 中国使用IE6 ...

  7. 基于.net开发chrome核心浏览器【五】

    一:本篇将解决的问题 本章主要为了解决一下几个问题: 1.JsDialog的按钮错位的问题 我们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,确定和取消按钮会出现错位的情 ...

  8. 基于.net开发chrome核心浏览器【一】(转)

    http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送I ...

  9. 基于.net开发chrome核心浏览器【六】

    写在前面: 距离发这个系列的上一篇文章已经过去两个多月了 因为工作上不涉及这一部分的内容,兼且琐事缠身,一直无力动笔写这个系列的第六篇文章 然而,有很多朋友都关注这个系列,希望我能再写写. 写文章有人 ...

  10. 解决Python开发中,Pycharm中无法使用中文输入法问题

    Pycharm是开发Python程序的利器,但有时会遇到无法输入中文的情况.表现为:在Ubuntu系统可以正常输入中文,却在Pycharm内写注释的时候,切换不出中文.下面演示如何解决此问题. 1.在 ...

随机推荐

  1. 提升软件质量?为什么不试试华为云CodeArts Check

    摘要:华为云CodeArts Check代码检查服务为用户提供包括代码风格.通用质量与代码安全风险等在内的检查能力,同时提供问题闭环处理.检查报告等功能,从而一站式完成代码检查作业. 本文分享自华为云 ...

  2. Golang代码测试:一点到面用测试驱动开发

    摘要:TDD(Test Driven Development),测试驱动开发.期望局部最优到全局最优,这个是一种非常不错的好习惯. 了解Golang的测试之前,我们先了解一下go语言自带的测试工具. ...

  3. FusionInsight MRS Flink DataStream API读写Hudi实践

    摘要:目前Hudi只支持FlinkSQL进行数据读写,但是在实际项目开发中一些客户存在使用Flink DataStream API读写Hudi的诉求. 本文分享自华为云社区<FusionInsi ...

  4. 论文解读丨LayoutLM: 面向文档理解的文本与版面预训练

    摘要:LayoutLM模型利用大规模无标注文档数据集进行文本与版面的联合预训练,在多个下游的文档理解任务上取得了领先的结果. 本文分享自华为云社区<论文解读系列二十五:LayoutLM: 面向文 ...

  5. 没想到,学棋五年的我竟然输给了昇腾CANN!

    摘要:整整两天,上百场对弈,TA竟然未尝一败,真是让人拍案叫绝. 近日,一位神秘"人物"亮相华为昇腾CANN技术开放日现场,引得众人簇拥,吸粉无数.从现场AI棋艺大战的画面中我们可 ...

  6. 常用的echo和cat,这次让我折在了特殊字符丢失问题上

    摘要:用过linux的都知道,echo和cat是我们常用的展示内容和写入内容的方式. 本文分享自华为云社区<echo和cat,重定向到文件时,解决特殊字符丢失问题>,作者: 大金(内蒙的) ...

  7. 开心档之C++ 数据封装

    C++ 数据封装 所有的 C++ 程序都有以下两个基本要素: **程序语句(代码):**这是程序中执行动作的部分,它们被称为函数. **程序数据:**数据是程序的信息,会受到程序函数的影响. 封装是面 ...

  8. 火山引擎DataTester:跨境电商网站,如何快速实施AB测试 ?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   如今中企出海的形态愈加多样,很多企业都建有独立站可直接触达海外客户,但获取优质流量的成本会更加高昂.当优质流量 ...

  9. mysql--ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

    问题背景: 1.在授权机器上连接mysql 8.0的数据库,账号.密码都没有问题,报错 2.使用 navicat工具连接8.0版本,报错 排查思路: 可能是创建用户没有指定插件使用了8.0自带的插件, ...

  10. 第六届蓝桥杯C++C组 A~F题题解

    蓝桥杯历年国赛真题汇总:Here 1. 分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, ...