基于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

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

相关推荐
streaker3032 天前
从复制 Token 到复用登录态:site-fetchkit 的抽离过程
前端·浏览器·ai编程
牛奶5 天前
从卡顿到顺滑,只差这几个优化
前端·chrome·浏览器
耿公子和编程5 天前
easybr指纹浏览器:轻量高效的环境隔离解决方案
前端·浏览器·开发工具
审判长烧鸡6 天前
【AI问答/前端】前端满天过海局(一)
前端·vue·浏览器
深念Y7 天前
我明白为什么B站没法在浏览器开直播了——Windows Chrome推流踩坑全记录
前端·chrome·webrtc·浏览器·srs·直播·flv
mCell8 天前
JavaScript:从事件循环到手写 Promise
javascript·面试·浏览器
Nturmoils13 天前
书签真正难的不是收藏,而是找回来:我是怎么做这个 Chrome 插件的
javascript·后端·浏览器
爱学习的程序媛13 天前
浏览器工作原理全景解析
前端·浏览器·web
Jack N14 天前
2026 浏览器原理 常见面试题(附答案)
前端·html·浏览器
哆哆啦0014 天前
URL 重写规则和静态资源解析逻辑
前端·浏览器·url