一、前言
两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题。具体而言,他在使用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
项目邀请:如对该项目有兴趣,欢迎联系我共同开发!!!