基于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为基础的控制标准空域问题适用。

三、使用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

项目邀请:如对该项目有兴趣,欢迎联系我共同开发!!!

相关推荐
Wect2 天前
HTML5 原生拖拽 API 实战案例与拓展避坑
前端·面试·浏览器
We་ct3 天前
HTML5 原生拖拽 API 基础原理与核心机制
前端·javascript·html·api·html5·浏览器·拖拽
牛奶4 天前
黑客是怎么偷走你账号的?
黑客·浏览器·xss
陈虚渊4 天前
浏览器自动化框架完全问答:从原理到自研实践
chrome·自动化·浏览器·webdriver bidi
七夜zippoe4 天前
OpenClaw 浏览器自动化实战
运维·chrome·自动化·浏览器·playwright·openclaw
Wect7 天前
深度解析浏览器本地存储:原理、方案与实战指南
前端·面试·浏览器
REDcker10 天前
iOS 与 Android:浏览器引擎、WebView 与生态差异概览
android·ios·内核·浏览器·webview
bu_shuo11 天前
在线电脑摄像头测试
电脑·浏览器·摄像头
Felicia-侧听11 天前
PDF不能打印怎么办?在线解决PDF限制的两个方法
pdf·浏览器·限制打印·限制复制
San3011 天前
从浏览器到 Node.js,这一次彻底搞懂 Event Loop 与异步模型
面试·node.js·浏览器