原文:微软输入法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() 结束这个拼写过程。

微软输入法TSF SampleIME 代码浅说相关推荐

  1. Win10自带微软输入法的全拼双拼一键切换

    代码参考了这里的内容,说是Win8可用.我的是Win10,测试了一下也是适用的. 在原代码基础上增加了echo输出,来提示当前切换到了哪种输入法 将下面的代码保存为bat文件运行即可 @echo of ...

  2. 动态输入法 TSF 启动过程分析

    为了解决 SampleIME + jvm 任务多开及 word 闪退的问题,对 动态输入法 TSF 的启动过程进行了分析. 顶层是 CSampleIME,在其构造函数中,startJVM() 启动 j ...

  3. 使用微软VS2015编写python代码

    使用微软VS2015编写python代码 by 李远祥 最近也有不少人问python代码编写使用什么工具比较好?关于工具的问题,好像是个亘古不变的话题.对于一些程序高手来说,很多时候就是使用文本编辑器 ...

  4. win10系统日语输入法只能打出英文字母无法切换微软输入法无法使用

    显示如下: 法1:如果添加了日文,也安装了基本输入,但是调出日文输入时屏幕右下角并不显示英文和假名的切换字母A,只能输入英文,这样的win10一般安装的是ghost版,一般ghost镜像版会把其他语言 ...

  5. win 11 微软 输入法 提示框 提示栏 消失 不见 不显示 找回 显示 可行性 解决方案

    背景 win 11 意外 造成 微软 输入法 提示框/提示栏 消失 不显示 注意 暂未重现问题 个人觉得自win10后微软自带的输入法还是蛮好用的,就没使用其他输入法,也可以尝试通过安装其他输入法解决 ...

  6. 教你自定义Windows10微软输入法

    如果你不习惯输入法的弹出各种广告,如果你想自定输入法输入输出,告诉你可以实现啦. Windows10 自带微软输入法可以直接自己定义了.例如输入"sj"自定义时间的输出. 操作如下 ...

  7. win10升级后删除自带的微软输入法

    win10升级后删除自带的微软输入法 背景 win10升级后关闭微软输入法的办法 背景 win10 升级后自带的微软输入法自动添加到了右下角的托盘中,升级前是不存在这里的,由于平时我没用这个输入法,用 ...

  8. 微软输入法设置小鹤双拼

    微软默认自带的双拼只有三种,其中没有小鹤双拼,可以通过以下三步来加入小鹤双拼,不需要自己一个个的修改按键. 1.win+R 输入 regedit,打开注册表 2 找到 HKEY_CURRENT_USE ...

  9. win10输入法不能切换_怎么解决win10系统微软输入法打不出汉字

    win10系统中微软输入法设置的已经非常符合国人的使用习惯了,不需要大家再次安装其他输入法也可以轻松的输入汉字,不仅可以节省空间还可以让系统更加安全,但是有的用户发现在输入文字的时候只能输入英文,汉字 ...

最新文章

  1. BAT也无法自我突破的战略困境解读
  2. python脚本在命令行中传递参数(附字符查找小案例)
  3. pgsql动态创建table
  4. Scala enumeration
  5. rails generator
  6. nssl1511-我的世界【堆,贪心】
  7. 用中位数代替平均数来衡量民生指标
  8. 淘宝/天猫优惠券获取API 接口
  9. 在服务系统部署MFC程序,出现DLL缺失情况的问题解决方式
  10. Windows11 校园网连ftp登录上传作业失败
  11. 单链表上的直接插入排序
  12. MySql中增加注释、追加注释、修改注释、查看注释
  13. qdir 类似工具_Qt 5.9 C++开发指南 PDF 高质量影印版
  14. 百度网盘 for Mac官方版哪里下?来未来软件园
  15. 腾讯web前端笔试题及个人答案
  16. 日常搬砖 - 腾讯X5 tbs 文件预览
  17. 分页计算总页数算法:总页数=(总数-1)/每页数量+1----总页数=(总数+每页数量-1)/每页数量
  18. Cantor三分集为啥不能在Myeclipse上完美实现呢?
  19. 医院LIS系统解决方案
  20. boost:atomic

热门文章

  1. 【EASYDOM系列教程】之 DOM 元素树
  2. 针对苹果最新审核要求 为应用兼容IPv6
  3. PaaS模式创新:实现应用可移植性
  4. 通过setTimeout处理click,dblclick,mousedown等事件的冲突
  5. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
  6. Oracle Study--RAW Device在Oracle下的应用
  7. 在MasterPage下FindControl的使用方法
  8. C语言程序设计 搜集C/C++编译器
  9. 【Java注解】注解基础
  10. TIME_WAIT状态及存在原因