一、前言

两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题。具体而言,他在使用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. 网络知识一箩筐:IP地址划分的那些知识点

    摘要:IP地址是怎么划分的呢?划分的依据是什么呢?本节小课将带你一起学习IP地址划分.子网划分.子网掩码.CIDR等网络基础概念,了解IP地址划分背后的那些故事. 首先,回忆一下,前面小课中我们有提到 ...

  2. 9个GaussDB常用的对象语句

    摘要:本文介绍了9个GaussDB常用的对象语句,希望对大家有帮助. 本文分享自华为云社区<GaussDB对象相关语句>,作者:酷哥. 1. 常用函数 pg_database_size() ...

  3. 带你了解AKG正反向算子注册+关联流程

    摘要:简要介绍一下akg正反向算子的注册和关联流程. 本文分享自华为云社区<AKG正反向算子注册+关联>,作者:木子_007 . 一.环境 硬件:eulerosv2r8.aarch64 m ...

  4. 原来的 service 命令与 systemctl 命令对比

    service [服务] start       systemctl start [unit type] 启动服务 #启动网络服务  systemctl start network.servicese ...

  5. 总结MySQL 的一些知识点:MySQL 连接的使用

    MySQL 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...

  6. 十大 CI/CD 安全风险(二)

    在上一篇文章中,我们主要介绍了 CI/CD 中流程控制机制不足和身份及访问管理不足两大安全风险,并为企业及其开发团队在缓解相应风险时给出了一些建议.今天我们将继续介绍值得企业高度关注的 CI/CD 安 ...

  7. Axure Axhub Charts 数据编辑、显示

    Axhub Charts图表元件库: https://www.axureshop.com/a/100749.html

  8. Kubernetes(K8S) Pod 介绍

    Pod 是 k8s 系统中可以创建和管理的最小单元, 是资源对象模型中由用户创建或部署的最小资源对象模型, 也是在 k8s 上运行容器化应用的资源对象, 其他的资源对象都是用来支撑或者扩展 Pod 对 ...

  9. C++17 更通用的 union:variant

    References 现代C++学习--实现多类型存储std::variant 如何优雅的使用 std::variant 与 std::optional std::variant 是 C++17 中, ...

  10. 前端知识点 | 查看已登录网站 Cookie 信息

    方法一:针对 Chrome 浏览器 设置 \(\to\) 隐私设置和安全性 \(\to\) Cookie 及其他网站数据 \(\to\) 查看所有 Cookie 和网站数据 or chrome://s ...