WPF 自定义文本框输入法 IME 跟随光标

这篇具有很好参考价值的文章主要介绍了WPF 自定义文本框输入法 IME 跟随光标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
本文告诉大家在 WPF 写一个自定义的文本框,如何实现让输入法跟随光标

本文非小白向,本文适合想开发自定义的文本框,从底层开始开发的文本库的伙伴。在开始之前,期望了解了文本库开发的基础知识

本文实现的效果如下

WPF 自定义文本框输入法 IME 跟随光标

实现

本文的方法参考了 WPF 官方仓库的逻辑,可以在 WPF 仓库的 wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Documents\ImmComposition.cs 文件看到官方是如何让 TextBox 控件获取输入法焦点,和在输入光标变更时,修改输入法的输入框坐标

先了解一下输入法的相关知识。在 Windows 编程开发里,输入法框架有三套,其中用的最多的是第二套。第二套是采用 IMM 进行对接的。所谓 IMM 就是 Input Method Manager 也就是 输入法管理器

相关的另一个缩写词 IME 则是 Input Method Editor 或者是 Input Method Engine 的缩写,含义是输入法编辑器或输入法引擎

应用程序可以通过 IMM 对接输入法。所用的 win32 的 API 重点是如下几个

  • ImmGetContext 获取输入法上下文,用于后续所有的其他函数调用
  • ImmAssociateContext 关联输入法和对应的窗口,让输入法了解在哪个窗口输入
  • ImmSetCompositionWindow 用来设置输入法的窗口的坐标,也是本文最重要的函数

本文接下来将告诉大家如何一步步实现封装对 IME 输入法调用,在本文最后将会给出所有的源代码

这部分对输入法的逻辑可以封装为一个类,这样上层就可以不关注细节逻辑。如例子代码,放在 IMESupporter 类型里

为了方便文本框的接入,咱再定义一个接口,用于设置文本框需要实现一些方法,用来提供参数给 IMESupporter 使用才能进行接入

    /// 
    /// 表示控件支持被输入法
    /// 
    interface IIMETextEditor
    {
        /// 
        /// 获取当前使用的字体名
        /// 
        /// 
        string GetFontFamilyName();

        /// 
        /// 获取字号大小,单位和 WPF 的 FontSize 相同
        /// 
        /// 
        int GetFontSize();

        /// 
        /// 获取输入框的左上角的点,用于设置输入法的左上角。此点相对于  所在元素坐标。对大部分控件来说,都应该是 0,0 点
        /// 
        /// 
        Point GetTextEditorLeftTop();

        /// 
        /// 获取光标的输入左上角的点。此点相对于  所在元素坐标
        /// 
        /// 
        Point GetCaretLeftTop();
    }

对于如微软拼音等输入法,是支持设置输入法的文本大小和字体。因此就需要文本框提供 GetFontFamilyName 和 GetFontSize 方法

而 GetCaretLeftTop 自然就是用来让输入法跟随的。为了让文本框可以做更多的定制,也需要 GetTextEditorLeftTop 方法,这个方法的返回值对大部分自定义的文本框控件来说,都应该是 0,0 点

在 IMESupporter 类型构造函数,期望传入文本框控件,如此可以解决初始化值和监听的锅

    internal class IMESupporter<T> where T : UIElement, IIMETextEditor
    {
        // ReSharper disable InconsistentNaming
        public IMESupporter(T editor)
        {
            Editor = editor;
            // 忽略代码
        }
    }

为了同时约束传入的文本框控件继承 UIElement 和 IIMETextEditor 接口,用了泛形

在文本框控件 Editor 获取焦点的时候,将需要唤起输入法进行输入。在 Editor 失去焦点的时候,就应该告诉输入法当前不进行输入

        public IMESupporter(T editor)
        {
            Editor = editor;
            Editor.GotKeyboardFocus += Editor_GotKeyboardFocus;
            Editor.LostKeyboardFocus += Editor_LostKeyboardFocus;
        }

        private T Editor { get; }

根据 WPF 的约定,对自定义的支持输入法的控件,需要设置 IsInputMethodSuspendedProperty 附加属性,如下面代码

            InputMethod.SetIsInputMethodSuspended(editor, true);

Editor_GotKeyboardFocus 需要实现的逻辑是调起输入法和设置初始的输入框的坐标。如上文,开始之前,需要先拿到输入法上下文。在拿到输入法上下文之前,可以先获取默认的 IME 类窗口句柄。先获取默认的 IME 类窗口句柄是为了在多进程嵌入窗口时,让微软拼音输入法的输入框跟随输入光标而不是在左上角

            _defaultImeWnd = IMENative.ImmGetDefaultIMEWnd(IntPtr.Zero);

以上的 _defaultImeWnd 是一个字段,在 IMESu文章来源地址https://www.toymoban.com/news/detail-442773.html

到了这里,关于WPF 自定义文本框输入法 IME 跟随光标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android同文输入法的使用(开源输入法Trime)

    想找一款开源的Android中文输入法,然后发现了这款备受推崇的输入法框架rime。 RIME/中州韵输入法引擎,是一个跨平台的输入法算法框架。 基于这一框架,Rime 开发者与其他开源社区的参与者在 Windows、macOS、Linux、Android 等平台上创造了不同的输入法前端实现。 这真的非常酷

    2023年04月08日
    浏览(36)
  • 卸载流氓软件云龙输入法和智能云输入法的方法

    希望中国互联网摆脱垃圾软件捆绑 步骤一:win+R ,输入 regedit,进入注册表编辑器 步骤二:在计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftCTFTIP(这下面有好多注册表) 步骤三:点击‘编辑’,在查找中直接输入‘智能云’,然后把下面的相应的文件删除就可以了。注意:我删除的

    2024年02月07日
    浏览(39)
  • android 12.0 第三方输入法app设置系统默认输入法

    在12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置输入法的相关功能需求,然后根据输入法包名来设置默认输入法 在设置系统默认输入法中 每个系统输入法的id不同 根据id设置输入法 需要先根据需要设置默认输入法的id,来

    2024年02月07日
    浏览(43)
  • 科大讯飞勾勒生成式AI输入法“模样”,开启下一代输入法革命

    回顾国内第三方输入法赛道近十余年的发展,移动互联网的市场红利催生了科大讯飞、百度、搜狗等颇具规模和实力的头部厂商。与此同时,历经多年、多方角逐,第三方输入法市场进入存量阶段,升级技术、优化用户体验来挖掘存量,成为决定竞争胜负的关键。 恰逢ChatG

    2024年02月07日
    浏览(30)
  • 苹果手机怎么设置九宫格输入法?快速切换九键输入法,轻松学会

    苹果手机与安卓手机有很大的不同,从安卓手机切换成苹果手机,不少的小伙伴表示不是很适应。有些习惯了使用九宫格输入法的小伙伴发现自己的苹果手机是26键输入法,不知道苹果手机怎么设置九宫格输入法。别担心,下面小编就来教你如何快速切换九宫格输入法。   不

    2024年02月09日
    浏览(37)
  • Win10自带输入法怎么删除-Win10卸载微软输入法的方法

    Win10 自带输入法怎么删除?Win10系统自带输入法就是微软输入法,这个输入法满足了很多用户的输入需求。但是,有些用户想要使用其它的输入法,这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软输入法的方法: 1. 在任务栏的语言

    2024年02月07日
    浏览(37)
  • linux安装搜狗输入法后无法输入中文

    linux安装sogou输入法参考官网教程,https://shurufa.sogou.com/linux/guide 如下图所示,安装后可以在右上角状态栏看到sogou输入法,但是只能输入英文,无法输入中文。 解决方法如下:

    2024年02月13日
    浏览(54)
  • Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456

    在嵌入式板子上由于没有系统层面的输入法支持,所以都绕不开一个问题,那就是在需要输入的UI软件中,必须提供一个输入法来进行输入,大概从Qt5.7开始官方提供了输入法的源码,作为插件的形式加入到Qt中,这里需要特别提示的是,该源码是gpl的,商业应用对这个比较不

    2024年01月21日
    浏览(77)
  • Ubuntu——搜狗输入法

       因为工作原因要运用到Linux,对于新手来说最容易上手的就是Ubuntu,在安装了Ubuntu之后,第一件事当然就是安装一个可以使用的汉语输入法,在这里我选择的是搜狗输入法的安装。 1.Ctrl+Alt+T,打开终端Terminal; 2.先添加以下源,在终端输入命令: 然后输入密码 3.更新一下

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包