首页 > 其他分享 >基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理

基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理

时间:2024-01-25 10:57:03浏览次数:38  
标签:CefSharp HwndHost 浏览器 输入法 https WPF com

一、前言

两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题。具体而言,他在使用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,HwndHost,浏览器,输入法,https,WPF,com
From: https://www.cnblogs.com/mchao/p/17985041

相关文章

  • chrom本地调试 selenium调试本地浏览器
    chrom本地调试 selenium调试本地浏览器1、cmd命令窗口执行下面命令,生成指定端口的chrom窗口。终端执行chrome.exe完整路径--remote-debugging-port=9222--user-data-dir="自定义用户信息文件夹路径",端口可修改。D:\Desktop\item\chromtest\Chrome\Application>chrome.ex......
  • vue 浏览器通知
    noticeRemind(target){   constnotificationInstanceArr=[]   //constnotificationAudio=newAudio('https://img-fe.tengzhihh.com/audio/c58fb135c2546f.mp3')   consthandleMessageFocus=(target)=>{    //可以在这里根据新消息t......
  • 使用rpa打开浏览器并执行js抓取页面元素详情步骤
    这里我们专门开一个文章来写如何在rpa中执行js获取页面元素。个人觉得,复杂点的需求用js会方便很多,所以后续的文章我都会重点使用js去获取页面元素。好,正文开始,我们先看一下rpa为我们提供的自带的方便的抓取元素的方式,我们还是以小红书为例,还是以上一个例子为例,上个例子我们使......
  • Uncaught (in promise) ChunkLoadError: Loading chunk commons.xxxxxxxxx failed
    报错信息如下:Uncaught(inpromise)ChunkLoadError:Loadingchunkcommons.pages_index.pages_teacher_indexfailed. (error:http://localhost:3000/_nuxt/commons.pages_index.pages_teacher_index.js)发生情景:打开多标签时,Nuxt程序崩溃:我有一个vue、nuxt应用程序......
  • 浏览器http自动跳转https解决方法
    在某个浏览器用https登录过之后,浏览器会自动改为https访问,导致测试环境进不去,需要删除hsts,不同浏览器的处理办法为:IE浏览器1.地址栏中输入edge://net-internals/#hsts2.在Deletedomain中输入项目的域名,并Delete(删除)3.可以在Querydomain测试是否删除成功。Chrome浏览器1.地......
  • 物联网浏览器(IoTBrowser)-简单介绍
    物联网浏览器(IoTBrowser)是用于开发人机界面(HMI)或数据采集与监督控制系统(SCADA)的工具,使用HTML或Vue前端技术开发物联网终端用户界面,支持串口、RFID、电子秤等硬件协议,支持js控制关机、全屏等工控操作。  一、示例功能展示1.窗口界面能力常用的功能界面全屏、设置......
  • 码农的转型之路-IoTBrowser(物联网浏览器)雏形上线
    消失了半个月闭门造轮子去了,最近干了几件大事:1.工控盒子,win10系统长时间跑物联网服务测试。运行快2周了,稳定性效果还满意,除了windows自动更新重启了一次。 2 .接触了一些新概念MQTT、HMI、SCADA,学习了几个物联网相关的开源项目IoTGateway、IoTSharp。在头条看到一个Web组态效......
  • 独立开发一款在线浏览器书签管理平台,网页剪藏,专注阅读模式-藏趣云浏览器书签
    藏趣云-阅读模式重磅来袭发布  新增功能模块大家好,今天给大家带来一个藏趣云的全新功能,网页阅读功能,和聚合搜索功能。网页阅读聚合搜索百度搜索:藏趣云了解更多  官网地址:藏趣云官网帮助文档与下载地址:下载地址和帮助文档 藏趣云介绍藏趣云是一款跨平台的......
  • 浏览器的回流(重排)和重绘,以及如何优化
    浏览器的回流(重排)和重绘 1、浏览器解析HTML生成DOM树,解析CSS生成CSSDOM树2、如何DOM树和CSSDOM树合并构建渲染树3、然后经过回流(回流主要是计算元素的形状、位置大小)4、然后再经过重绘(重绘就是转化为屏幕上的实际像素,来达到页面展现的目的)  引起回流的动作有: 浏......
  • chrome内核浏览器:测试环境:url(ip+端口)设置cookie、session失败
    chrome内核浏览器:测试环境:url(ip+端口)设置cookie、session失败有个单点登录系统,登录成功,通过:ip+端口/xxx.js方式设置,目标网址的cookie、session.,通过跳转访问目标网站。在测试的时候,发下cookie、session怎么设置都不成功。登录成功:设置cookie、session t跳转过去,发现原来......