微软输入法TSF SampleIME 代码浅说

原文:微软输入法TSF SampleIME 代码浅说

微软提供了一个简单的TSF拼音输入法的示例SampleIME,主要的问题是:不支持数字键选候选字,不能自动上屏,没有联想功能。在笔者开发动态输入法Windows版时,以其为蓝本,主要针对上面几个问题进行了改造:支持数字键选,支持自动上屏,支持联想。下面从应用的角度对SmapleIME源代码进行解说,看看从按键到汉字上屏这个过程都发生了什么。

SampleIME 的源代码结构

SampleIME 的源代码有四五十个cpp文件,这些文件可以说是支离破碎,不清楚原作者为什么要这么做,非常怀疑是故意的。其中比较重要的有这么几个类:CCandidateWindow,候选字窗口;CCompositionPricessorEngine,拼写引擎;CSampleIME,主程序。另外,SampleIME还定义了一种特殊的字符串类:CStringRange,见于 SampleIMEBaseStructure.h。其他有用的类的会陆续说到。

CSampleIME 中定义了拼写引擎_pCompositionProcessorEngine ?和候选字列表提供者 _pCandidateListUIPresenter,后者包含一个候选字窗口。

  • CSampleIME:

    • CCompositionProcessorEngine* _pCompositionProcessorEngine;
    • CCandidateListUIPresenter *_pCandidateListUIPresenter;
      • CCandidateWindow *_pCandidateWnd;

以上就构成了输入法的主体框架。

?

输入过程概览

输入过程,就是从用户敲击按键到文字上屏(到达预定的编辑区域)的全过程,应该说,对于 Windows 系统来说,这个过程极其地繁琐。

首先,在中文模式下,不是所有按键都会送给输入法处理,这里定义了所有支持的按键:CCompositionProcessorEngine::InitKeyStrokeTable()。注意,其中的键值,并非按键符号的ASCII码,而是键盘按键的 keycode,只不过恰好26字母的keycode==ASCII,具体请百度。

然后,当用户按下了一个按键,首先会被传递到这里:CSampleIME::OnTestKeyDown(),为什么是Test呢?就是测试以下这个按键是否需要处理。如果需要处理,就传递给CSampleIME::OnKeyDown(),也就是交给输入法处理了。当用户松开这个按键的时候,也相应地依次传递给 CSampleIME::OnTestKeyUp() 和 CSampleIME::OnKeyUp()。

接下来,被支持的按键,如果不是删除键,就被传递到这里:CSampleIME::_HandleCompositionInput();如果是删除键,则传递到:CSampleIME::_HandleCompositionBackspace();这两个分支里面各自经历了一系列过程,但最终都是调用CCompositionProcessorEngine::GetReadingStrings()产生了一个拼写文本,然后再调用CCompositionProcessorEngine::GetCandidateList()获得一个候选字列表。什么是拼写文本呢?就是输入的时候带有下划线的那部分还没有确认上屏的文本。

至此,输入法的基本面貌已经有了,但是还差一步,就是确认拼写文本,把候选字上屏。一般这是由空格或者回车来实现的。但是这个最后一步,也是极其的繁琐,最终在CSampleIME::_TerminateComposition() 结束这个拼写过程。

原文地址:https://www.cnblogs.com/lonelyxmas/p/9718003.html

时间: 2024-10-12 11:44:36

微软输入法TSF SampleIME 代码浅说的相关文章

体验评价--微软输入法

我当前使用的输入法是win8自带的微软输入法,使用了将近三年了,对这款输入法也有了自己的用户体验,下面我就这款输入法,做出我的体验评价. 一.用户界面 虽然微软输入法的界面非常朴素,但是符合我的品味,我在这类常用软件上追求的是功能齐全,界面简洁,不许要太花里胡哨,该有的都有,不该有的没必要有,因此在用户界面上我还是很满意的,给个9分吧. 二.记住用户选择 这款输入法相比其他输入法,比如搜狗输入法,在记住用户的选择这方面还是做得有点欠缺,毕竟没有那么大的功能,但是对我而言,这样的功能对我来说已经足

微软输入法删除

今天在使用 office 的时候,总是给我用的微软输入法(悲剧). 我按照以往的习惯步骤: 控制面板 -> 区域和语言 -> 键盘和语言 -> 更改键盘 ,然后在弹出框里面讲微软输入法都删除了 得到的结果就是,其他软件里面没有微软输入法,而 office 里面任然是万恶的微软输入法. 这是什么原因呢?百度之后,发现是在安装office的时候,选择了安装微软输入法.那现在我们就来删除这个输入法,步骤如下: 控制面板 -> 程序和功能 -> 选择 office -> 点击标

微软的.NET示例代码放在Github上了

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:微软的.NET示例代码放在Github上了.

【uiautomator】输入中文(输入法安装+测试代码)

备注: 1.Utf7Ime官网下载需要增加修改部分文件,因此附上地址:http://download.csdn.net/detail/victoria_vicky/8799851,可直接导入Eclipse使用 2.src下载地址:http://download.csdn.net/detail/victoria_vicky/8799973 3.将来可能用到的 一.安装输入法 1.下载Utf7Ime.rar,解压缩到本地文件夹 2.导入到Eclipse:File->Import->General-

CVE-2019-0708—微软RDP远程桌面代码执行漏洞复现

0x01 2019年9月7日凌晨,msf上更新了0708的漏洞利用程序. 顿时安全群和朋友圈就爆炸了 - 奈何接到HW攻击队任务,又在家过了个中秋,0708才在今天更新. 0x02 环境 Windows 7 sp1 Kali exp 0x02 利用 1.一键安装metasploit-framework curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploi

vc编程的ime输入法菜单开发

如何初识 WINDOWS 下 IME 编程 IME 编程心得 第一章 Windows9x 系统下汉字输入法的基本原理 第二章 Windows9x 系统提供的 ime 管理函数 第三章 ime 文件中必须使用的结构 自由拼音输入法的测试 输入法程序 [ime] 的调试方法 输入法 (IME) 实现原理 大家知道, DELPHI 许多控件有 IME 属性.这么好用的东西 VC 可没自带,怎么办呢?其 实,可通过注册表,用 API 实现.下面说一下本人对 IME 的研究结果,并提供示例工程供 大家参考

输入法

我手头正在使用Win8系统自带微软输入法 用户界面(最右): 以前用过搜狗的输入法,感觉它的界面做得很精致,在角落会弹出一些小动画,所以每隔一断时间我就会纠结要换个什么皮肤,改个什么颜色.但实际上我只需要一个能输入英文和中文的输入法.就像现在,能判断当前模式就足够了. 记住用户选择: 只要是输入过的字或词就会有记录,并且能按照使用次数的频率来排序. 短期刺激.长期使用的好处坏处: 我使用的微软输入法目前版本为了更好的让用户能看到目前所处的模式,会在光标的附近弹出提示:中/英.短期来说,确实很方便

微软Visual Studio Code 0.8.0发布,新增多种主题

微软在2015年4月30日,Build 开发者大会上,正式宣布了 Visual Studio Code 项目;并将其定义为:一个运行于 Mac OS X.Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器. Visual Studio Code(图片来自:code.visualstudio) ??微软Visual Studio Code代码编辑器更新至0.8.0.本次更新增加了多种主题,包括著名的Monokai:针对WIndows系统采用基于Inno Se

利用 AttachThreadInput 改变其它进程的输入法状态

利用 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 消息 改变 其它 进程 的 输入 状态 ? 众所周知,通过 ActivateKeyboardLayout 函数可以 改变 当前线程的 输入 法 状态 ,不过最近发现通过 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 连用可以 利用 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 消息改变其它进程的输入状态 ?