原文:微软输入法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. 微软的.NET示例代码放在Github上了

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

  2. Win10 的微软输入法输入稍快竟然会导致死机

    一周前,新装机器一次,竟然死机两三次,多发生在敲字时,最近逐步排查发现的这个问题,查阅了一下网上方案,果断采用了第三方输入法,至今没再死机过. 不过第三方输入法也不安分,是不是推送点头条新闻过来,和驱 ...

  3. Win10-1909删除自带的微软输入法,添加美式键盘

    删除自带     输入法切换          

  4. Microsoft Language and Locale Codes(微软语言和地区代码汇总)

    https://msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx

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

    0x01 2019年9月7日凌晨,msf上更新了0708的漏洞利用程序. 顿时安全群和朋友圈就爆炸了 - 奈何接到HW攻击队任务,又在家过了个中秋,0708才在今天更新. 0x02 环境 Window ...

  6. 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]

    SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...

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

    本文告诉大家在 WPF 写一个自定义的文本框,如何实现让输入法跟随光标 本文非小白向,本文适合想开发自定义的文本框,从底层开始开发的文本库的伙伴.在开始之前,期望了解了文本库开发的基础知识 本文实现的 ...

  8. 关闭shift中英文切换 英文代码/中文注释随意切换着写。

    x 背景 写代码的时候总是意外的就切成中文了,特别是代码中大小写切换的这种情况... 例如:"public static TimeZone CurrentTime..."publi ...

  9. 20165310 NetSec2019 Week6 Exp4 恶意代码分析

    20165310 NetSec2019 Week6 Exp4 恶意代码分析 一.实验要求 1.系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间 ...

随机推荐

  1. Windows平台CUDA开发之前的准备工作

    CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...

  2. 最全面的iOS和Mac开源项目和第三方库汇总

    标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...

  3. pthread_join/pthread_exit的使用方法解析

    官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...

  4. ios开发总结,日常开发:ios开发功能收集,经验分享等等(不断更新中。。。)

    github资料学习和下载地址:https://github.com/niexiaobo/MyDailyDevelopmentNotes ios 学习模块 ios APP 日志管理的重要性: 一个功能 ...

  5. .net core 微服务之Api网关(Api Gateway)

    原文:.net core 微服务之Api网关(Api Gateway) 微服务网关目录 1. 微服务引子 2.使用Nginx作为api网关 3.自创api网关(重复轮子) 3.1.构建初始化 3.2. ...

  6. WPF动画结束后的行为方式

    原文:WPF动画结束后的行为方式 在WPF中可以使用Animation来完成动画功能,如移动,旋转等,最近写的一个程序需要实现控件的移动,包括自动移动和手动控制.原理很简单,就是改变控件的Margin ...

  7. 【BZOJ 1037】[ZJOI2008]生日聚会Party

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题意] [题解] /* 设f[i][j][k][l] 表示前i个人中,有j个男 ...

  8. 【codeforces 791D】 Bear and Tree Jumps

    [题目链接]:http://codeforces.com/contest/791/problem/D [题意] 你可以从树上的节点一次最多走k条边. (称为跳一次); 树为无权树; 然后问你任意两点之 ...

  9. 利用WPF建立自己的3d gis软件(非axhost方式)(一)

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(一) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密码:1te1 地 ...

  10. JS高级程序设计拾遗

    <JavaScript高级程序设计(第三版)>反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的.记不清的地方记录下来,方便以后巩固. 0. <script& ...