You are on page 1of 84

硕士学位论文

(工程硕士)

基于文本服务框架的拼音输入法客户端设
计与实现
DESIGN AND IMPLEMENTATION OF PINYIN
INPUT METHOD CLIENT BASE ON TEXT
SERVICES FRAMEWORK

王世元

哈尔滨工业大学
2013 年 6 月
国内图书分类号:TP319 学校代码:10213
国际图书分类号:004.41 密级:公开

工学硕士学位论文

基于文本服务框架的拼音输入法客户端设
计与实现

硕 士 研 究 生: 王世元

导 师: 秦 兵 教 授

副 导 师: 宋闻博 工程师

申 请 学 位 : 工程硕士

学 科: 软件工程

所 在 单 位: 软件学院

答 辩 日 期: 2013 年 6 月

授予学位单位 : 哈尔滨工业大学
Classified Index: TP319
U.D.C: 004.41

Dissertation for the Master’s Degree in Engineering

DESIGN AND IMPLEMENTATION OF PINYIN


INPUT METHOD CLIENT BASE ON TEXT
SERVICES FRAMEWORK

Candidate: Wang ShiYuan


Supervisor: Prof. Qin Bin
Associate Supervisor: Engineer Song WenBo
Academic Degree Applied for: Master of Engineering
Speciality: Software Engineering
Affiliation: School of Software
Date of Defence: June, 2013
Degree-Conferring-Institution: Harbin Institute of Technology
哈尔滨工业大学工程硕士学位论文

摘 要

在现今资讯化的时代,电脑已经在人们的日常生活中占有重要的地位。中
文内容在互联网慢慢发展,并逐渐起到主导作用,中文输入的重要性也越来越
突出。输入法作为基础应用软件使人们的日常工作和生活更加便捷,尤其是拼
音输入法作为普通用户最为熟悉的输入方式,对于用户意义更加深远。一款简
洁实用方便的拼音输入法显得尤为重要。
拼音输入法基于文本服务框架实现。文本服务框架提供输入法系统应用相
关接口,文本服务实现文本服务框架接口,可以接受和响应系统消息,客户端
依次对这些消息处理完成了整个输入的过程。在输入法模块划分时,依据高内
聚、低耦合原则,将平台无关部分划分成为公共模块,其与输入法框架无关,
提供给输入框架直接使用,间接减少开发任务量。
本文对用户使用习惯进行需求分析,了解输入法国内外发展现状,进一步
明确需求。根据需求分为文本服务模块和公共模块。文本服务模块适配文本服
务框架,实现框架接口,响应系统消息并获取数据,提供给公共模块使用,为
图形显示模块服务。公共模块是与输入法框架无关模块,完成引擎管理、皮肤
绘制和设置输入法功能。引擎管理模块管理多个引擎,不同引擎接口不一致,
屏蔽接口差异,统一引擎接口,将不同引擎提供候选结果进行整理,维护候选
词本地缓存,实现翻页功能。设置工具提供用户图形化界面方便配置输入法。
皮肤模块解析皮肤数据文件,依据数据将皮肤绘制出来。部分功能模块依赖比
较基础的功能,把一些基础功能进一步抽象,成为基本工具模块,相当于工具
箱,每个类都能解决某一个特定的功能,在项目中频繁的使用,减少了功能相
似的代码,使整个项目更加简洁清晰。
最后针对整个项目进行功能测试和兼容性测试,确保系统达到预期,为其
他输入法开发人员提供了新思路。

关键词:拼音输入法;文本服务框架;引擎管理;皮肤绘制

-I-
哈尔滨工业大学工程硕士学位论文

Abstract
In today's era of information technology, the computer has been in people's
daily life plays an important role. Chinese content on the Internet develop slowly
and gradually play a leading role. The importance of Chinese input has become
increasingly prominent. Input method is the basis for the software. Input method
makes people's daily work and life more convenient. Especially Pinyin input method
is most familiar one for ordinary users. Pinyin input method for users has a greater
significance. A simple, practical and convenient input method is very important.
Pinyin input method is based on Text Services Framework. Text Services
Framework provides system application interface. Pinyin input method realize Text
Services Framework interfaces, response system messages, and Client process these
messages in turn to complete the entire input process. I based on high cohesion, low
coupling rules to module division. I put the platform-independent part of the
division as a public module. It has nothing to do with the input method framework.
And is directly supplied to the input frame. That reduces the development effort.
I analyze user habits and summarize the input requirements. I understand the
input method development in the world and further clarify the requirements. In this
paper, the text service module and the common module. Text Service Module
adaptes Text Services Framework, implements framework interfaces, responds to
system messages and retrieves data from the system. Data can be provided to the
public module and display module for the UI service. Common module contains the
engine management module, the module configuration tool and the skin three
sub-modules. Engine management module manages multiple interfaces inconsistent
engine, unifies engine interface, puts different engines provide results for the second
candidate sort, maintains a local cache of candidate words and finishes flip function.
Tool provides a graphical user interface to configure the input method. Skin module
parse skin data files, to get skin data and draw out the skin. Basic tool module is
based modules and a toolbox for other modules. Each of these classes can solve a
specific function, Public module will be used frequently in the project, reducing the
functional similarity of the code, so that the whole project is more simple and clear.
Finally, I conduct functional testing and compatibility testing to ensure the
system to meet expectations. This article will provide new ideas for other
developers.
Keywords: Pinyin input method,Text Services Framework, Engine management,
Skin rendering

- II -
哈尔滨工业大学工程硕士学位论文

目 录

摘 要 ..........................................................................................................................I
ABSTRACT ................................................................................................................ II
第1章 绪 论 ........................................................................................................... 1
1.1 课题来源及背景 ........................................................................................ 1
1.2 课题研发的目的和意义 ............................................................................. 1
1.3 与本课题有关的国内外研究状况 .............................................................. 1
1.4 本文的主要研究内容 ................................................................................. 3
第 2 章 需求分析与总体设计 ................................................................................... 5
2.1 输入法工作区域 ........................................................................................ 5
2.2 输入操作需求 ............................................................................................ 6
2.2.1 符号映射..................................................................................................... 6
2.2.2 候选提交..................................................................................................... 8
2.2.3 候选翻页..................................................................................................... 8
2.2.4 显示更新..................................................................................................... 9
2.2.5 皮肤绘制..................................................................................................... 9
2.3 设置工具需求 .......................................................................................... 10
2.4 输入环境 ................................................................................................. 10
2.5 非功能需求 ............................................................................................. 10
2.6 文本服务框架技术 ...................................................................................11
2.6.1 文本服务框架工作原理 ........................................................................... 11
2.6.2 文本服务框架主要概念 ........................................................................... 13
2.6.3 文本服务框架主要接口 ........................................................................... 14
2.7 系统总体设计 .......................................................................................... 15
2.7.1 输入法解决方案 ....................................................................................... 15
2.7.2 拼音输入法整体架构 ............................................................................... 16
2.7.3 拼音输入法功能结构设计 ....................................................................... 17
2.8 本章小结 ................................................................................................. 18
第 3 章 文本服务模块设计与实现 ......................................................................... 19
3.1 文本服务中的模块 .................................................................................. 19
3.2 输入服务模块设计与实现 ....................................................................... 19

- III -
哈尔滨工业大学工程硕士学位论文

3.3 按键映射模块设计与实现 ....................................................................... 24


3.3.1 按键预处理 ............................................................................................... 24
3.3.2 输入状态转换 ........................................................................................... 26
3.3.3 按键转换引擎事件 ................................................................................... 26
3.3.4 热键管理................................................................................................... 31
3.4 图形展现模块设计与实现 ....................................................................... 31
3.5 本章小结 ................................................................................................. 32
第 4 章 公共模块设计与实现 ................................................................................. 33
4.1 引擎管理模块 .......................................................................................... 33
4.1.1 引擎管理层次划分 ................................................................................... 33
4.1.2 处理逻辑................................................................................................... 37
4.2 皮肤模块 ................................................................................................. 39
4.2.1 皮肤文件简介 ........................................................................................... 39
4.2.2 皮肤文件解析 ........................................................................................... 40
4.2.3 皮肤绘制................................................................................................... 44
4.2.4 皮肤模块处理逻辑 ................................................................................... 45
4.3 设置工具 ................................................................................................. 47
4.4 基本工具模块 .......................................................................................... 47
4.4.1 注册表管理 ............................................................................................... 48
4.4.2 文件映射................................................................................................... 48
4.4.3 词库管理................................................................................................... 49
4.4.4 共享数据................................................................................................... 50
4.4.5 崩溃管理................................................................................................... 50
4.4.6 配置管理................................................................................................... 51
4.5 系统应用效果 .......................................................................................... 53
4.5.1 皮肤绘制界面 ........................................................................................... 53
4.5.2 设置工具界面 ........................................................................................... 53
4.6 本章小结 ................................................................................................. 55
第 5 章 系统测试 ..................................................................................................... 56
5.1 测试环境 ................................................................................................. 56
5.2 功能性测试 ............................................................................................. 56
5.2.1 基本输入测试 ........................................................................................... 56
5.2.2 设置工具测试 ........................................................................................... 65
5.2.3 输入环境测试 ........................................................................................... 67

- IV -
哈尔滨工业大学工程硕士学位论文

5.3 兼容性测试 ............................................................................................. 68


5.4 本章小结 ................................................................................................. 69
结 论 ....................................................................................................................... 70
参考文献 ................................................................................................................... 71
哈尔滨工业大学学位论文原创性声明和使用权限 ............................................... 74
致 谢 ....................................................................................................................... 75
个人简历 ................................................................................................................... 76

-V-
哈尔滨工业大学工程硕士学位论文

第1章 绪 论

1.1 课题来源及背景

项目名称:基于文本服务框架拼音输入法客户端的设计与实现。
本项目来自腾讯科技(北京)有限公司输入法组的一个项目。输入法组负
责腾讯公司输入法项目,包括个人电脑(PC)客户端和手机、平面电脑(pad)
等移动设备。支持 Windows、IOS、Android 等市场上的主流平台。本课题就是
其中的一个项目。微软公司发布了 Windows 8 操作系统,这款操作系统和以往
不同,一个新的亮点即其全新的 Metro 风格用户界面,各类快捷方式和应用程
序将以磁性贴、即动态方法的方式向用户展示,同时提供屏幕触控支持,使人
们日常操作更加高效,提出了全新的概念,在 Metro 风格应用下不支持传统的
输入法管理器-输入法生成器(IMM-IME)接口的输入法,要求使用全新的文本
服务框架(Text Services Framework)接口,因此输入法需要重新开发以适配新
输入法框架,针对新的用户界面、新的交互方式,输入法客户端开发将迎来新
的机遇和挑战,力求提供给用户更好的体验,让用户惊喜。

1.2 课题研发的目的和意义

输入法作为用户必备的软件,无论是个人电脑(PC)还是移动设备,输入
数据都是必备的功能,输入法将作为系统的基础软件 [1] ,高效的输入将对用户
使用带来极大的便捷,同时作为基础软件就意味着拥有众多用户群,使用之广
泛,对其功能开发利用得合理,就有和浏览器一样成为互联网入口的潜质。
公司之前开发的输入法各个版本都是针对输入法管理器 -输入法生成器
(IMM-IME)[2]框架开发的,同样市面上的输入法除了微软的输入法以外,都
采用 IMM-IME 框架开发的,然而 Windows 8 Metro 界面不支持该框架 [3] ,支持
文本服务框架(TSF)。这对于所有公司都是一个挑战,同样也是机遇,是抢占
市场的好机会。
因此把输入法 [4] 做好,既对公司起着战略意义,又将对用户生活和工作起
到便捷作用。

1.3 与本课题有关的国内外研究状况

输入法是将各种符号输入到计算机 [5] 或其他设备(如手机)而使用的编码

-1-
哈尔滨工业大学工程硕士学位论文

方法 [6] 。汉字输入 [7] 的编码,大多数采用将音、形、义与特定的键相联系,根


据不同汉字进行组合以完成汉字的输入 [8]。
汉语拼音输入法 [9] 是利用汉字的读音进行输入的中文输入法。全拼和双拼
是汉字拼音输入法两种输入方案 [10]。较多用户使用中文输入法,市场上此类输
入法产品较多。大多数中文操作系统 [11]都包含自带的中文输入法,如 Windows
的微软拼音 [12]和智能 ABC。另外拼音加加、紫光拼音、黑马神拼、南极星字词
拼音和互联网公司开发的谷歌输入法、百度输入法、QQ 输入法、搜狗输入法
也赢得了众多用户,获得广泛使用。
八十年代初随着汉字编码 [13]的发明,众多中文输入法涌现出来,发展到现
在输入法 [14]经历三个时代。
第一代输入法发展到了九十年代中期,计算机应用主要是在文字处理 [15]
上,当时国内金山 WPS 比较普及,对于中文输入法 [16]来说迎来了发展好时机。
当时市面上多种编码方式 [17],可谓是“万码奔腾”的时代,与之相对应输入法
有全拼输入法、王码五笔输入法、自然码、郑码输入法、黑马输入法等,其中
王码五笔输入法和全拼输入法 [18]比较流行,为众多用户使用,其中拼音输入法
是通过输入单个汉字的完成拼音,缺点比较明显,逐字输入,艰难繁杂,重码
[19]
较多,使得输入速度慢,逐字输入的方式也比较死板。拼音 [20]输入比较麻烦,
五笔输入法相对快捷,但是用户来说比较难学。简拼 [21]和双拼 [22]在当时是比较
好的解决方案,简拼就是将一个汉语的韵母用一个英文字母表示。比如将 z 表
示 an,则要输入“元”只需要将输入“yuz”即可,确实简化了不少。双拼是
另外一种拼音输入方案 [23],每个汉字只需要输入两个字母,声母和韵母各一键,
就可以输出一个汉字。第一代拼音输入法智能程度较低,文字输入的速度相对
于其他输入法差距较大,其对用户的覆盖程度 [24]以及用户使用频率都不高,没
能像五笔字型那么流行,但是第一代拼音输入法使汉字和英文等文字站在了信
息化[25]的同一起跑线,让中国人拥有向计算机输入汉字 [26]的能力,具有巨大的
历史意义。
第二代拼音输入法在二十一世纪初期开始得到全面发展,Windows 操作系
统 [27]内置的微软拼音输入法和智能 ABC 和市面上流行的紫光拼音输入法和拼
音加加作为第二代输入法代表。此时的输入法完全支持词组输入,与第一代输
入法有着本质的区别。第一代只能输入字的完整拼音 [28],比如输入“北京”即
“Beijing”,第二代输入法不仅可以全拼输入,而且可以只输入该词组的声母,
用“bj”即可输出“北京”。大家很熟悉的自动调频 [29]功能也是在这个时期出现
的,例如第一次输入“beijing”时,
“北京”位于第二候选,下次输入时就排到

-2-
哈尔滨工业大学工程硕士学位论文

了第一候选,因此用户使用输入法越久输入速度越快。南方音或者模糊拼音、
以词定字 [30]、笔形输入 [31]、符号输入 [32]等许多特色功能,也是用户的输入效率
得到了提升。随着自我学习 [33]、智能联想 [34]、细分专业词 [35]库等功能的不断完
善,用户使用拼音输入法输入文本的速度相对于第一代输入法来说得到大幅提
升。拼音输入法简捷、迅速、高效,免去了第一代输入法重码的困扰,背诵五
笔字根,不需要用户花费其他学习成本,只要会拼音就能快速打字,普通话不
标准的用户也能轻松打字输入,很快赢得了大批用户,同时“万码奔腾”的中
文输入法时代也渐渐远去,多数不太知名的输入法也逐渐退出历史舞台,拼音
输入法也奠定了中文输入法主流的市场地位。电脑走进了千家万户拼音输入法
也是最大功臣。近十年来,拼音输入法仍不断发展,由词组输入向短语输入过
渡,智能分析能力得到提高,词库也越来越大,越来越专业。
搜狗拼音输入法在 2005 年以后崛起,迎来了第三代拼音输入法时代的到
来,三代拼音输入法在二代拼音输入法的基础上,凭借互联网的优势,依靠词
库互助升级,使用户词库处于最新状态,也添加了网络搜索功能,自我学习能
力得到显著提高,英文单词提示和中英文词典等功能,也更加方便用户使用,
通过网络同步用户的个性化设置 [36]、用户词典和个人使用习惯,大量个性化皮
肤的出现,帮助用户打造个性化输入法,甚至是专属输入法,智能化程度更高。
输入法作为一款基础应用,已成为每个用户必备,越来越多公司看中其特质,
纷纷涉足拼音输入法这块阵地,搜狗输入法、QQ 输入法、百度输入法和谷歌
输入法是目前比较有代表性的拼音输入法,另外阿里巴巴等公司也都开发其输
入法,以占取桌面市场 [37]。第三代拼音输入法产生使众多厂商纷纷占有拼音输
入法市场,进而达到成为厂商占领用户桌面和移动终端 [38]的目的。其地位得到
大幅度提高。第三代拼音输入法当然也不是拼音输入法的最后阶段,给用户提
供了便利,同时也带来了一些负面影响,如词库变得越来越大,输入法软件变
得越来越庞大,输入法响应速度 [39]变慢。随着网络条件的提升,在线拼音输入
法 [40]将有可能成为发展趋势,使用户变得更加便捷,不需要安装包和升级词库。
中文输入法的重要地位吸引各个厂商加入输入法的大军,充满竞争,激发
厂商持续创新,为用户带来更加便捷的产品。

1.4 本文的主要研究内容

基于文本服务框架拼音输入法客户端是在 Windows 平台上开发使用的,功


能将分为以下几个部分实现,具体内容如下所述。
(1)设置工具,是用户设置输入法的入口,要求界面简洁、可用性强。同
-3-
哈尔滨工业大学工程硕士学位论文

时设置工具是各个功能的入口,设置工具将体现用户需要设置引擎的参数,并
将设置结果传递给引擎;设置工具将提供用户常用功能的热键使用。
(2)按键映射,是整个输入法客户端重要部分,主要控制输入状态和输入
逻辑,完成个性化功能,并且和其他模块提供服务,共同完成输入功能。
(3)初始化,负责整个输入法客户端的初始化工作,为其他模块正常工作
提供了必要条件。
(4)输入服务,和使用输入法的应用程序交互,提交候选词至应用程序,
完成对应用程序内容编辑功能。
(5)UI 展现,候选窗口展现用户的输入串和候选词,状态栏显示输入法
客户端当前输入状态,做到界面简洁友好。
(6)引擎管理,管理不同引擎,做到屏蔽差异性,统一对外接口,统一管
理候选序列。方便其他模块使用,也便于扩展管理多个引擎,减少引擎接口带
来的风险。
本文中分为五个章节进行论述,组织结构如下:
第一章 绪论,介绍了本课题的来源和背景以及研发的目的和意义,然后针
对本课题相关的国内外现状情况进行了调研。
第二章 需求分析与总体设计,介绍了输入法工作区域,明确一下概念,从
输入操作需求、设置工具需求、输入环境和非功能需求四个方面阐述了课题的
需求,介绍文本服务框架技术,进行了系统的总体设计。
第三章 文本服务模块设置与实现 文本服务模块是响应文本服务框架的重
要模块,由 UI 展示模块、按键映射模块和输入服务模块三个模块组成,本章
将着重介绍这三个模块。
第四章 公共模块设计与实现 公共模块是抽象出来的功能,完成一些较基
础工作,本章将分引擎管理模块、皮肤模块、设置工具模块和基本工具模块四
个部分介绍。
第五章 系统测试 对系统进行了功能测试 [41] 、非功能测试 [42] 和兼容性测
试 [43],对系统进行评估,确保系统争取行。
最后对整个论文工作进行总结,总结论文的完成情况并讨论工作方向。

-4-
哈尔滨工业大学工程硕士学位论文

第 2 章 需求分析与总体设计

本部分将介绍输入法客户端的工作区域、功能需求和非功能需求。

2.1 输入法工作区域

(1)候选窗口:显示用户输入拼音串和候选内容的窗口,如图 2-1 所示。

图 2-1 候选窗口
(2)状态栏:指的是能显示当前输入法的状态的窗口,如图 2-2 所示。

图 2-2 状态栏

(3)写作区:指的是候选窗口的上半部分,如图 2-3 中红框所示。

图 2-3 写作区
(4)候选区:指候选窗口的下半部分,其中蓝色字的是选中的焦点候选项,
其余为非选中的候选项,如图 2-4 中红框所示。

图 2-4 候选区
(5)翻页键:候选窗口上的按钮,帮助用户向前、向后翻页选择需要的
候选项,如图 2-5 所示。

图 2-5 翻页键
(6)分割线:候选窗口的一条分割线,用来划分写作区和候选区,如图

-5-
哈尔滨工业大学工程硕士学位论文

2-6 所示。

图 2-6 分割线
(7)写作串:显示在候选窗口写作区的内容是写作串,写作串包含拼音
串、半选词、光标几种元素。其中拼音中存在切分符即单引号“’”,用来标示
拼音分组,并且影响候选结果,拼音串中多数切分符为系统添加,用户也可以
添加切分符,如图 2-7 所示。

图 2-7 写作串构成说明
(8)候选提交:所选候选项的文本提交到当前输入环境。
(9)文本服务框架(Text Services Framework):是 Windows 系统上一种
新的输入法框架,本文中出现的 TSF 即为 Text Services Framework 的缩写。
(10)输入法编辑器(Input Method Editor):是 Windows 系统上的一种输
入法框架,本文中出现的 IME 即指 Input Method Editor 的缩写。

2.2 输入操作需求

输入操作需求主要对用户对于拼音输入的基本操作进行分析,输入操作需
求将由以下几个需求进行阐述。

2.2.1 符号映射

(1)中文状态下输入大写英文和数字,在中文输入状态下,可以输入大写
英文字母和数字。如果直接输入数字,不显示输入窗口直接提交上屏。
(2)标点配对(单双引号),输入引号(包括单引号和双引号)时,依次
显示左引号和右引号。
(3)智能句点,在中文状态全角符号下,输入数字后第一次输入“.”,则
显示英文句号“.”,其他情况下,则显示中文句号“。”。
(4) 单字模式,选词过程中按数字 0 键可直接跳转至单字候选项开始处。

-6-
哈尔滨工业大学工程硕士学位论文

(5)支持中文、英文符号的输入,在中英文语言环境下,同一符号可以映
射为不同的符号,要支持的中英文符号映射如表 2-1 所示:
表 2-1 中英文符号输入对应表
英文符号 中文符号 英文符号 中文符号
! ! { {
@ @ } }
# # \ 、
$ ¥ | |
% % ; ;
^ …… : :
& & ‘ 第一次 ‘
* * ’ 第二次 ‘
( ( “ 第一次 “
) ) ” 第二次 ”
- - < 《
_ —— > 》
= = , ,
+ + . 。
[ 【 / 、
] 】 ? ?
` · ~ ~

(6)快捷键切换中英输入状态、中英标点,可以用快捷键切换中英文输入
状态和中英文标点状态。需要支持的快捷键有:Shift 键切换中英文输入状态;
Ctrl+.组合键切换中英文标点状态。这两个状态可能的组合结果有下面几种:中
文输入状态/中文标点状态时,输出中文,标点符号为中文标点;中文输入状
态/英文标点状态时,输出中文,标点符号为英文标点;英文输入状态/英文
标点状态时,输出英文,标点符号为英文标点;英文输入状态/中文标点状态
永远不出现。可能的状态切换行为定义如表 2-2 所示:

-7-
哈尔滨工业大学工程硕士学位论文

表 2-2 状态切换表
切换前状态 快捷键 切换后状态
英文输入/英文标点 Ctrl+. 中文输入/中文标点
中文输入/英文标点 Shift 英文输入/英文标点
英文输入/英文标点 Shift 中文输入/中文标点
中文输入/中文标点 Ctrl+. 中文输入/英文标点
中文输入/中文标点 Shift 英文输入/英文标点
中文输入/英文标点 Ctrl+. 中文输入/中文标点

2.2.2 候选提交

(1)鼠标选词提交,用户在中文状态下输入写作串之后,可以用鼠标左键
点击候选区出现的某一个候选词使其上屏。
(2)空格上屏,按键盘上空格键可以是处于焦点的候选词上屏。
(3)数字选词,按键盘上数字键可以选择输入窗口中相应的候选词使之上
屏。
(4)符号上屏,在输入写作串后,用户继续按标点符号,则拼音串的第一
候选词和该标点符号直接上屏。适用的标点符号如表 2-3 所示。如果输入的符
号不在上表中,则符号也进入写作串,不直接上屏。
表 2-3 中英文符号输入对应表
键盘符号 上屏符号 键盘符号 上屏符号
, , ^ ……
\ 、 ! !
/ 、 ? ?
“ “ < 《
( ( > 》
) ) : :

2.2.3 候选翻页

(1)快捷键翻页,当候选词较多时,用户可以使用翻页快捷键在多页候选
词之间翻页。翻页快捷键有:“-”、“=”,减号向前翻页,等号向后翻页。一种

-8-
哈尔滨工业大学工程硕士学位论文

特殊情况是,如果用户输入拼音后直接按减号键,则“-”进入写作串。
“[”、
“]”,
左中括号向前翻页,右中括号向后翻页。翻页快捷键可通过输入设置,配置哪
对快捷键生效。
(2)鼠标翻页,用鼠标点击输入窗口中的候选词上下翻页箭头可以向前、
向后翻页。

2.2.4 显示更新

(1)实时显示候选,在拼音写作区每输入一个字母,都立即调整候选区的
候选词。
(2)方向键移动光标位置更新写作串,输入写作串之后,可以按键盘上的
左、右方向键把写作区的光标位置向左或向右移动。注意三点:每按一次右方
向键光标向右移动一个字母;如果在一次拼音输入过程中,还没有按过右方向
键,则每按一次左方向键光标向左移动一个字的拼音;如果在一次拼音输入过
程中,已经按过了右方向键,则每按一次左方向键向左移动一个字母;移动光
标后,可以在光标位置处编辑拼音。
(3)上下方向键移动焦点候选项,按动键盘上下方向键时,候选区的焦点
候选项随之改变。按上方向键向左移一个词,按下方向键向右移一个词。
(4)方向键移动光标位置改变候选项焦点,移动光标时,候选区的焦点也
发生变化。
(5)候选窗口光标跟随,即输入时,输入窗口应始终显示在输入光标位置
的正下方。如果由于显示空间不足不能显示在正下方,则应保证在光标下方且
距离光标位置最近的地方显示输入窗口。
(6)退格键删除拼音,输入拼音的过程中,可以按键盘上的退格键删除拼
音输入区光标位置左边的拼音字母。
(7)动态词频(私人词库),用户输入过的字、词、短句记录入用户的私人
词库,用户再次输入时可以智能提示。同时,可以根据用户的使用频率来调整
候选词的排序。
(8)维持全局输入状态,在第一次使用本输入法时,读取设置工具中设置
的初始状态,之后在其他应用中再次使用本输入法时,将保持使用上一次的状
态,状态包括中英状态、简繁体状态和符号的中英状态。

2.2.5 皮肤绘制

输入法支持多种皮肤,每个皮肤都对应着一个皮肤文件,皮肤文件中存储
-9-
哈尔滨工业大学工程硕士学位论文

显示所需要的资源文件,和资源文件显示所需的坐标数据,并根据这些资源进
行皮肤的绘制,绘制内容包括候选窗口和状态栏,每次更换激活的皮肤文件时,
候选窗口和状态栏的绘制将根据皮肤文件立即更新。

2.3 设置工具需求

设置工具中提供了用户一些基本输入设置,方便用户使用。
(1)设置输入语言初始状态,可设置为中文或者英文,同时支持用户在中
文状态下是否使用英文标点。
(2)繁体初始状态设置,可设置为简体模式或繁体模式。
(3)模糊音设置,设置工具提供了包括声母和韵母的多组常用拼音模糊功
能,其中包含韵母“an=ang”、“en=eng”、“in=ing”、“ian=iang”、“uan=uang”
和声母“c=ch”、
“s=sh”、
“z=zh”、
“l=n”、
“f=h”、
“r=l”。此模糊功能对于普通
话不标准的用户来说可以提高输入的方便性和准确性,但是将增多重码。如想
输入“牛奶”,在开启 “n=l”规则后,就可以模糊输入,如输入 niu’lai,则候
选中会有“牛奶”出现。
(4)配置候选翻页快捷键,有 4 种快捷键可供选择,逗号句号,减号等号,
左右方括号([ ]),Tab 与 Shift+Tab。
(5)热键设置,需完成几种功能的快捷键设置,分别是“简体/繁体转换”,
“截屏工具”。
(6)提供恢复默认设置功能,让系统处于默认状态。
(7)提供当前系统中可用输入法列表,并且可以对其设置,选择那些出现
在状体栏中可用。

2.4 输入环境

(1)支持 Windows 8 Metro 环境的输入。


(2)支持 DOS 窗口环境输入。
(3)支持文本区输入。

2.5 非功能需求

(1)稳定性
输入法将提供给广大用户使用,由于用户量较大,需要在各个方面做到程
序的健壮性,给用户较好的用户体验。

- 10 -
哈尔滨工业大学工程硕士学位论文

(2)兼容性
输入法支持 Windows 8 系统,支持 32 位系统和 64 位系统。
(3)扩展性
为了每个版本的迭代开发,每个版本会陆续添加一些新的功能,要求系统
设计时,做到系统接口的可扩展性,方便以后使用。
(4)技术要求
输入法客户端整体实现需要使用文本服务框架。
输 入 法 设 置 工 具 要 求 编 译 出 的 可 执 行 文 件 尽 量 小 , 建 议 不 使 用 MFC
(Microsoft Foundation Classes)、ATL(Active Template Library)、WTL(Windows
Template Library)等技术实现,因为会链接较多库文件使可执行文件变大。完
成这项需求就要使用 Win32 API(Application Programming Interface,应用程序
编程接口)完成设置工具功能。

2.6 文本服务框架技术

微软最新发布的 Windows 8 操作系统,Metro 界面应用不再支持 IMM-IME


结构,而是只支持文本服务框架(Text Services Framework),Windows XP 及之
前,是只支持 IMM (Input Method Manager),基于纯函数 API 的。Windows XP
开始及以后,Windows 提供新的输入框架 TSF,是基于 COM 的。实际上,到
了 Windows Vista,Windows 7,所有的应用程序和各种输入控件都是优先使用
TSF 的实现。但之所以 Windows Vista,Windows 7 用户还能使用各种基于 IMM
的输入法,是因为 Windows 提供了一个组件来将所有 TSF 的请求转为 IMM 的
API。本部分主要介绍文本服务框架的工作原理和文本服务框架接口介绍,帮
助我们实现输入法客户端。

2.6.1 文本服务框架工作原理

(1)什么是文本服务框架
文本服务框架是一个与输入设备无关、与输入语言无关的可扩展系统,可
以向文本输入和语言处理提供相关服务。
文本服务框架是一个允许进行高级的、来源无关的文本输入的应用编程接
口(API)。文本服务框架是以一组 COM 接口的方式向应用程序和文本服务公
开其框架的。文本服务框架是一个简单且可扩展的框架,支持文字输入和自然
语言处理技术。在文本服务应用中,可以启用文字服务,该服务提供多种语言

- 11 -
哈尔滨工业大学工程硕士学位论文

支持,同时提供键盘处理器,手写识别和语音识别等多种文字服务。
支持文本服务框架的应用程序可以从任何支持文本服务框架的文本服务中
接收文本输入,但并不需要知道有关文本来源的任何详细信息。
文本服务以何种方式向客户端程序输送文本时,并不需要知道对方是如何
接受或处理这些文本的。比如文本服务可以通过语音或手写的方式提供文本内
容,客户端程序即使完全不知道如何使用语音或手写设备也不妨碍它正确接收
到这些文本。
(2)为什么要使用文本服务框架
文本服务框架允许一个支持文本服务框架的应用程序从任何数量的设备或
来源中接收文本输入。因为文本服务框架是可扩展的,所以应用程序可以从少
量或无限的附加文本源中接收文本输入。
一个文本服务既可以从任何支持文本服务框架的应用程序中接收文本,也
可以输出文本,却不需要知道有关对方程序的详细信息。这种体系结构使得文
本服务可以利用到任何支持文本服务框架的应用程序中。文本服务可以作为一
个与任何特定程序无关的单独模块来安装或更新。文本服务框架还允许文本服
务通过一个文档、一个文本片段或文档中的一个对象来存储元数据。比如,一
个语音输入文本服务可以存储与一段文本相关的语音信息。
文本服务框架向文本服务提供持续文档缓冲区访问状态下正确和完整的文
本转换支持。文本服务使用文本服务框架的好处在于能够避免把程序功能划分
为输入模式和编辑模式。因为这种输入机制可以动态改变缓冲区和文本流汇聚,
所以能够提高键盘输入和文本编辑的效率。
文本服务框架的设备无关性使得文本服务可以从多种设备包括键盘、手写
笔和麦克风中接收文本内容。
(3)文本服务框架体系结构
文本服务框架(TSF)由以下三个主要部分组成如图 2-8 所示。
典型的应用程序任务包括有显示、直接编辑和文本存储。应用程序通过实
现一个 COM 服务来提供文本访问能力,该服务应该提供几个使用 TSF 管理器
接口的 TSF 接口和通道。
文本服务的功能是向应用程序提供文本,它既可以包含文本输入/输出,
也可以包含应用程序,还可以作为一段文本的数据和属性的关联体。文本服务
也是以 COM 来实现的,它内置了把自己注册为 TSF 的服务过程。文本服务注
册完成后,用户就可以使用语言栏或键盘快捷方式来与文本服务进行交互了。
系统中允许同时注册多个文本服务。

- 12 -
哈尔滨工业大学工程硕士学位论文

应用程序

文本存储

文件管理器 线程管理器

TSF管理器

文本服务 文本服务 ... 文本服务

图 2-8 文本服务框架(TSF)基本体系结构

输入法客户端实现文本服务框架,已完成文本服务这个角色。
TSF 管理器是应用程序和文本服务之间沟通的桥梁,一个应用程序可以和
一个也可以同时与多个文本服务建立联系。文本服务不会直接与应用程序打交
道,所有的联系都是通过 TSF 管理器进行的。TSF 管理器的功能是由操作系统
实现的,且不能被任何形式的应用程序代替。
在这个体系结构中,TSF 管理器在应用程序和文本服务之间提供了一个抽
象层。抽象层允许一个应用程序和一个或多个文本服务共享文本内容,并使 TSF
管理器能够对文本服务进行管理。

2.6.2 文本服务框架主要概念

(1)文本存储:是由应用程序提供来源,通过 TSF 管理器实现的一种在应


用程序和文本服务之间共享文本流的机制。该机制把文档看作是包含 Unicode
字符和引用嵌入内容的控制代码的文本流,它使用字符的应用程序字符位置

- 13 -
哈尔滨工业大学工程硕士学位论文

(ACP)来定位和操作文本流。
(2)片段:所有文本都存储在一个被称为片段的对象中。片段是一个描述
了存在于用作读、写和操作文本的文本流里面的某一小段文本的对象。文本片
段不与应用程序中文本流上的字符位置(ACP)相关联,而是涉及并与特定的
文本段联系在一起,这就使得当该段文本在文本流中的位置发生变化时,也不
需要重新定义相应的片段,即片段是可游移的。
(3)属性:属性被用来关联文本片段和元数据。这些属性包括粗体文本、
文本语言标识符和文本服务提供的原始数据。
(4)公共缓冲池:客户端程序之间可以通过公共缓冲池来实现数据共享,
它为数 据共 享提 供了 一个数 据存 储和 消息 处理的 机制 。公 共缓 冲池是 通 过
GUID 来标识的,唯有用这个标识号才能访问一个特定的公共缓冲池。客户端
程序通过发布 GUID 来实现一个公共缓冲池的共享,而任意一个别的模块都可
以使用公开的 GUID 来获取相应公共缓冲区的数据。只有已注册为 TSF 客户端
的程序才能修改公共缓冲池的数据,因为在修改数据时必需提供一个 TfClientId
类型对象。由于公共缓冲池的数据是作为无类型数据存储的,所以在公布一个
公共缓冲池的时候,也应该同时把数据类型和格式一并公开。
(5)文档锁:因为 TSF 可以同时从多个文本输入来源中接收内容,所以应
用程序必须支持文档加锁。文档锁的作用是允许 TSF 管理器对文本内容进行互
斥访问(获取或修改)。比如,在管理器向当前选定的范围内插入文本的过程中,
自然无法接受还有其它途径可以修改目标范围内容的可能性存在。因此为了避
免这种情况,管理器必须先请求并取得一个文档锁。

2.6.3 文本服务框架主要接口

(1)线程管理器(ITfThreadMgr):是 TSF 管理器的基本组成部分,由它


完成有关应用程序和文本服务(客户端)之间进行联系的公共任务。这些任务
包括(但不限于)激活或挂起 TSF 文本服务、文档管理器的创建和维护文档与
输入焦点之间的正确关联。
(2)客户端标识符(ITfClientId):在文本服务框架中,应用程序和文本服
务被定义为客户端。所有客户端都会接收到并必须要维护一个由线程管理器分
配的客户端标识符,客户端在调用各种 TSF 方法的时候通常都需要出示自己的
客户端标识符。
(3)编辑内容(ITfContext):TSF 定义了一个被称之为“编辑内容”的基
本文本输入模型,它可以理解为一个通过 ITfContext 接口创建的连续的文本流,

- 14 -
哈尔滨工业大学工程硕士学位论文

通常是由应用程序创建编辑内容提供给文本服务使用,不过并不是说文本服务
就不可以创建编辑内容了。不管是哪种类型的程序创建了编辑内容,在 TSF 框
架中都被理解为编辑内容所有者。
(4)文档管理器(ITfDocumentMgr):文档管理器是通过 ITfDocumentMgr
接口创建并用来管理编辑内容的。每个文档管理器都维护着一个被称之为内容
栈的后进先出缓冲区,内容栈里面存储的就是该文档管理器所管理的编辑内容
列表。通常内容栈里面只有一个编辑内容,不过根据需要,也可以把其它内容
添加到栈中。每个栈最多只允许装载两个内容。
(5)输入组合(ITfComposition):输入组合是一个临时输入状态,它允许
一个文本服务把应用程序和输入文字的用户保持在一个不断变化的状态中。应
用程序可以且应该获取输入组合的显示属性信息,并使用这个信息来把输入组
合状态显示给用户。应用程序根据输入组合是否存在来决定如何显示和显示什
么样的文本,并完成相应的处理工作。

2.7 系统总体设计

2.7.1 输入法解决方案

在整个输入法解决方案中,可以分为客户端、引擎和自然语言处理的部分,
引擎及自然语言处理部分作为公共部分提供给众多平台的客户端使用。本课题
是基于文本服务框架拼音输入法客户端,主要针对 Windows 系统平台,是整个
输入法解决方案重要的一部分,详情如图 2-9 所示。
本图是输入法解决方案架构图,自然语言处理负责分析语料,进而生产词
库,提供给引擎层;引擎层根据客户端提供的拼音串,去搜索系统词库和用户
词库,根据词频等进行排序产生候选,并将候选提交到客户端。客户端要提供
一个良好的交互方式,将候选展示给用户,良好的交互需要分析用户输入习惯,
得知用户输入需求,比如单字输入、网址模式、自由编辑,将输入结果反馈给
用户,同时客户端将建立用户词库,在用户输入过程当中添加用户输入的词语
至用户词库,并为引擎提供搜索数据以便用户提高输入准确性。

- 15 -
哈尔滨工业大学工程硕士学位论文

Windows IOS …… Andriod

客户端

候选序列 拼音串

输入法引擎

读取词库

词库1 词库2 …… 词库n

自然语言

图 2-9 输入法解决方案整体架构

2.7.2 拼音输入法整体架构

由于输入法需要支持 Windows 多个版本操作系统,较早版本支持 IME 输


入框架,对 TSF 输入框架支持不好,如 Windows Xp,之后的 Windows 7 可以
很好支持 TSF 和 IME 框架,对于 Windows 8 传统桌面支持 TSF 和 IME 框架,
而 Windows 8 的 Metro 界面只支持 TSF 框架,针对这样的环境和需求以及
Window xp 平台上的众多用户,决定输入法客户端将同时支持 IME 和 TSF 框架,
两种框架就相当于开发两个独立的输入法,为了保证工作量最小和维护成本最
低,将两个输入法框架的共用部分提炼一下保证代码的可重用性,形成公共模
块,本文主要研究 TSF 输入框架,IME 输入框架将不继续探讨。
经分析,公共模块主要包含引擎管理模块,皮肤绘制模块和设置工具三个
模块。如图 2-10 所示。引擎管理模块将管理多个引擎;不同引擎之间的接口不
统一,需要统一引擎接口;需要将不同引擎提供候选结果进行二次排序;维护
候选词本地缓存实现翻页功能。皮肤模块将根据皮肤文件中获取的数据和指定
的规则,将候选窗口和状态栏绘制出来。设置工具也是公共模块中的一部分,
向用户提供图形化界面,方便用户对输入法进行个性化设置。基本工具模块提

- 16 -
哈尔滨工业大学工程硕士学位论文

供基本的工具类,为其他模块使用方便,提高代码的可重用性。

TSF IME

公共模块

基本工具模块

图 2-10 输入法整体架构

2.7.3 拼音输入法功能结构设计

根据课题主要研究内容、需求分析和上述整体架构的设计,对输入法客户
端整体进行了模块划分,其功能结构如下图 2-11 所示。总体分为 3 个部分,文
本服务模块、公共模块和基本工具模块。文本服务模块分为输入服务模块、按
键映射模块和 UI 展现模块;基本工具模块由注册表管理、文件映射、词库管
理、共享数据、崩溃管理和配置管理组成;公共模块分为引擎管理模块、设置
工具和皮肤模块 3 个部分。
输入法客户端

文本服务模块 公共模块

输 按 基 引
UI 起 设 皮
入 键 本
展 管 置 肤
服 映 工
现 理 工 模
务 射 具
模 模 具 块
模 模 模
块 块
块 块 块

输 按 注 读 写
按 热 共 配 输 输
入 键 文 词 崩 输 取 入 皮 皮
键 册 入 入
状 转 键 件 库 享 溃 置 入 配 配 肤 肤
预 表 服 引
态 换 管 映 管 数 管 管 模 置 置 解 绘
处 管 务 擎
转 事 理 射 理 据 理 理 式 信 信 析 制
理 理 层 层
换 件 息 息

图 2-11 输入法功能结构图

- 17 -
哈尔滨工业大学工程硕士学位论文

2.8 本章小结

本章首先介绍了输入法工作区域的相关概念,便于后续章节的理解,其次,
讨论了输入法的需求分析,然后介绍了文本服务框架技术,最后基于以上内容
进行了系统总体设计,同时对输入法整体进行了功能结构划分。

- 18 -
哈尔滨工业大学工程硕士学位论文

第 3 章 文本服务模块设计与实现

3.1 文本服务中的模块

本模块主要与文本服务框架相关,文本服务框架提供输入法这种系统应用
相关接口,输入法客户端只要实现文本服务框架接口,响应系统消息,客户端
依次对这些消息处理即完成了整个输入的过程,本模块的实现由以下几个子模
块完成。
输入服务模块:系统将候选窗口分为两类,一类不需要输入法客户端绘制
候选窗口,而是交由系统绘制,输入法客户端只需要提供数据,数据包括输入
串和候选词序列;另一类需要输入法客户端自己绘制候选窗口,并将输入串和
候选词作为绘制内容。输入服务模块需要和系统交互,向应用程序提交候选项。
按键映射模块:响应所有键盘事件,当接收的消息为提交消息时,将消息
传递给输入服务模块;其他消息转化为引擎可以处理的消息,传递给引擎管理
模块。按键映射模块将维护不同的输入状态,不同的输入状态按键将对应着不
同的功能。
UI 展现模块:是展现候选窗口和状态栏的模块。

3.2 输入服务模块设计与实现

输入服务模块需要完成对应用程序编辑功能,编辑内容来源于按键映射模
块需要提交上屏的候选项,作为文本服务必须通过请求一个编辑会话,完成编
辑内容中获取、修改或设置文本。请求到编辑会话之后,文本服务管理器就会
和目标文本的所有者协商创建适合被请求类型的文档锁。当文档锁被获准授予
之后,文本服务管理器才允许文本服务在编辑内容上读取或写入文本。
文本服务框架被设计为通过组件对象模型(COM)来使用。输入法客户端
将作为一种文本服务。文本服务的功能是向应用程序提供文本,它既可以包含
文本输入/输出,也可以包含应用程序,还可以作为一段文本的数据和属性的
关联体。文本服务也是以 COM 来实现的,文本服务注册完成后,用户就可以
使用语言栏或键盘方式来与文本服务进行交互了。系统中允许同时注册多个文
本服务。
为了把文本服务注册为标准 COM 进程服务项,初始化模块就必须将它注
册到文本服务框架里面,这样它才能被应用程序所使用。文本服务框架通过
- 19 -
哈尔滨工业大学工程硕士学位论文

ITfInputProcessorProfiles 和 ITfCategoryMgr 接口来提供简单的注册过程支持。


当某个应用程序处于活动状态,并在语言栏中选定了某种适当的语言时,
它才可以使用某项文本服务。因此为方便使用,文本服务框架要求一个文本服
务应该把自己注册到系统支持的每一种语言中。文本服务是通过系统接口方法
来注册它的语言配置的。
初始化模块必须为输入法客户端注册适当的类别,才可以作为文本服务被
使用,明确那何种情况加载文本服务,为应用程序使用。例如,对于支持显示
属性信息的文本服务来说,它必须通过 ITfCategoryMgr::RegisterCategory 方法
把自己注册为一个显示属性提供者。
文本服务框架允许由文本服务来为文本提供显示属性,这些属性需要输入
服务模块来提供,以向用户提供更多的视觉反馈功能。比如,一个拼写检查文
本服务可以在单词上加上红色下划线来实现对错误单词的突出显示。显示属性
的提供是通过在 TF_DISPLAYATTRIBUTE 结构中定义文本前景色、文本背景
色、下划线样式、下划线色彩和下划线宽度来实现的。使用显示属性信息的客
户端通常为应用程序,但也可以是文本服务。文本服务框架管理器负责显示属
性提供者和客户端之间的协调,以及跟踪特定显示属性的提供者等工作。
输入服务模块提供获取应用程序的文本的属性功能,如获取输入文本框属
性,判断系统此时需要输入中文还是输入英文,并更改输入法中英状态。
输入服务模块是和系统平台相关的,将会调用其他模块进行工作,同时也
将是输入法客户端的入口。
输入服务模块中包含多个部分,大致可以分为一下几类:有数据相关的类,
其中一部分是实现框架需要相关数据,这部分用来和输入法框架进行交互,要
做的事情就是将这些结构中的数据填充,输入法框架读取这些数据,已达到交
互的作用;另一部分是自定义的数据,封装好结构便于后续开发工作;语言栏
相关的类,负责管理状态栏,添加语音栏按键,事件响应,中英文输入切换等;
管理候选相关的类,一部分和输入法框架进行交互,另一部分为候选窗口提供
数据;编辑会话相关的类。

- 20 -
哈尔滨工业大学工程硕士学位论文

CTipCandidateList
T : class
#_refCount: long CDynamicArray
#_tfCandStrList: CDynamicArray<ITfCandidateString*>
-_innerVect: CDynamicInnerArray
<<create>>-CTipCandidateList(candStrReserveSize: size_t)
<<destroy>>-CTipCandidateList() <<create>>-CDynamicArray()
+SetResult(nIndex: ULONG, imcr: TfCandidateResult): STDMETHODIMP <<create>>-CDynamicArray(count: size_t)
<<destroy>>-CDynamicArray()
CTipCandidateString +GetAt(index: size_t): T
<<CppTypedef>> +GetAt(index: size_t): T
#_refCount: long IM_EVENT_MSG +RemoveAt(index: size_t): void
#_index: int +Count(): UINT
#_candidateStr: std::wstring +Append(): T
+reserve(Count: size_t): void
<<create>>-CTipCandidateString() <<CppSynonym>> +Clear(): void
<<destroy>>-CTipCandidateString()
+GetString(pbstr: BSTR): STDMETHODIMP
+SetIndex(uIndex: ULONG): STDMETHODIMP <<CppStruct>>
_IM_EVENT_MSG CStringRange

+nEvent: UINT #_stringBufLen: DWORD_PTR


CEnumTfCandidates
+nKey: UINT #_pStringBuf: WCHAR
#_refCount: LONG +wparam: UINT <<create>>-CStringRange()
#_rgelm: CDynamicArray<ITfCandidateString*> +lparam: UINT <<destroy>>-CStringRange()
#_currentCandidateStrIndex: UINT
+Get(): WCHAR
<<destroy>>-CEnumTfCandidates(: void) +GetLength(): DWORD_PTR
+Skip(ulCount: ULONG): STDMETHODIMP +Clear(): void
+Reset(): STDMETHODIMP +Set(pwch: WCHAR, dwLength: DWORD_PTR): void
+Set(sr: CStringRange): void
<<CppOperator>>+=(sr: CStringRange): CStringRange

图 3-1 输入服务数据相关类图
输入服务数据主要和输入法框架进行交互,只要将结构中的数据填充,输
入法框架读取这些数据,已达到交互的作用;另一部分是自定义的数据,封装
好结构便于后续开发工作。相关类图如图 3-1 所示。
输入法客户端要和输入法系统框架进行通信,需要实现文本服务框架中的
接口,其中 CCandidateListUIPresenter 类负责管理候选结果,候选窗口的创建
销毁和显示隐藏,和翻页管理;CTfTextLayoutSink 类和系统交互得到文本输入
焦点,CSearchCandidateProvider,在 Windows8 的系统搜索栏中起到作用,他
们主要实现了和系统相关的接口,其类图如图 3-2 所示。

- 21 -
哈尔滨工业大学工程硕士学位论文

CCandidateListUIPresenter

+_updatedFlags: DWORD
CTfTextLayoutSink
#_pCandWnd: CCandidateWindow
#_isShowMode: BOOL -_pRangeComposition: ITfRange
#_hideWindow: BOOL -_pContextDocument: ITfContext
#_ptCandWnd: POINT -_tfEditCookie: TfEditCookie
-_uiElementId: DWORD -_pTextService: CTextService
-_pTextService: CTextService -_dwCookieTextLayoutSink: DWORD
-_refCount: LONG -_refCount: LONG
+_pContextDocument: ITfContext
<<destroy>>-CTfTextLayoutSink()
<<destroy>>-CCandidateListUIPresenter() +_EndLayout(): VOID
+GetDescription(pbstr: BSTR): STDMETHODIMP +_GetContextDocument(): ITfContext
+GetGUID(pguid: GUID): STDMETHODIMP +_LayoutDestroyNotification(): VOID
+Show(showCandidateWindow: BOOL): STDMETHODIMP -_AdviseTextLayoutSink(): HRESULT
+IsShown(pIsShow: BOOL): STDMETHODIMP -_UnadviseTextLayoutSink(): HRESULT
+GetUpdatedFlags(pdwFlags: DWORD): STDMETHODIMP
+GetDocumentMgr(ppdim: ITfDocumentMgr): STDMETHODIMP
+GetCount(pCandidateCount: UINT): STDMETHODIMP
+GetSelection(pSelectedCandidateIndex: UINT): STDMETHODIMP
+GetString(uIndex: UINT, pbstr: BSTR): STDMETHODIMP CSearchCandidateProvider
+GetPageIndex(pIndex: UINT, uSize: UINT, puPageCnt: UINT): STDMETHODIMP
+SetPageIndex(pIndex: UINT, uPageCnt: UINT): STDMETHODIMP -_refCount: LONG
+GetCurrentPage(puPage: UINT): STDMETHODIMP -_pTip: ITfTextInputProcessorEx
+SetSelection(nIndex: UINT): STDMETHODIMP
+Finalize(: void): STDMETHODIMP <<destroy>>-CSearchCandidateProvider()
+Abort(: void): STDMETHODIMP +SetResult()
+SetIntegrationStyle(guidIntegrationStyle: GUID): STDMETHODIMP
+FinalizeExactCompositionString(): STDMETHODIMP
+_LayoutDestroyNotification(): VOID
+OnSetThreadFocus(): HRESULT
+OnKillThreadFocus(): HRESULT
+GetCandidateWindowPos(): POINT
+IsShowMode(): BOOL
+IsShowOwnCand(): BOOL
+IsGetDataByPage(): BOOL
+IsExistCandidateList(): BOOL
+EndCandidateList(): HRESULT
-BeginUIElement(): HRESULT
-EndUIElement(): HRESULT
-UpdateUIElement(): HRESULT
-ToShowCandidateWindow(): HRESULT
-ToHideCandidateWindow(): HRESULT
-DestoryCandidateWindow(): void
-MoveCandidateWindow(lpRect: RECT): void

图 3-2 候选服务模块类图

语言栏模块提供热键注册功能,方便状态切换;语言栏上有多个语言项,
每个项是一个按钮,这些按钮项将由统一语言管理者进行管理,语言栏模块类
图如图 3-3 所示。

- 22 -
哈尔滨工业大学工程硕士学位论文

CLanguageBarMgr CLangBarItemButton

-_langid: LANGID -_pLangBarItemSink: ITfLangBarItemSink


-_guidProfile: GUID -_tfLangBarItemInfo: TF_LANGBARITEMINFO
-_tfClientId: TfClientId -_pTooltipText: LPCWSTR
-_PreservedKey_IMEMode: XPreservedKey -_onIconIndex: DWORD
-_PreservedKey_DoubleSingleByte: XPreservedKey -_offIconIndex: DWORD
-_PreservedKey_Punctuation: XPreservedKey -_isAddedToLanguageBar: BOOL
-_pLanguageBar_IMEMode: CLangBarItemButton -_isSecureMode: BOOL
-_pLanguageBar_DoubleSingleByte: CLangBarItemButton -_status: DWORD
-_pLanguageBar_Punctuation: CLangBarItemButton -_pCompartment: CCompartment
-_pCompartmentConversion: CCompartment -_pCompartmentEventSink: CCompartmentEventSink
-_pCompartmentConversionEventSink: CCompartmentEventSink -_cookie: DWORD
-_pCompartmentKeyboardOpenEventSink: CCompartmentEventSink -_refCount: LONG
-_pCompartmentDoubleSingleByteEventSink: CCompartmentEventSink
-_pCompartmentPunctuationEventSink: CCompartmentEventSink <<create>>-CLangBarItemButton()
-_isComLessMode: BOOL <<destroy>>-CLangBarItemButton()
+Show()
<<create>>-CLanguageBarMgr(: void) +OnMenuSelect()
<<destroy>>-CLanguageBarMgr(: void) +UnadviseSink()
+GetLanguageProfile(plangid: LANGID): GUID +CleanUp()
+GetLocale(): LCID +SetStatus()
+SetLanguageBarStatus(status: DWORD, isSet: BOOL): void
+ShowAllLanguageBarIcons(): void
+HideAllLanguageBarIcons(): void

CCompartment
CCompartmentEventSink
-_guidCompartment: GUID
-_pCompartment: ITfCompartment -_punk: IUnknown
-_dwCookie: DWORD -_tfClientId: TfClientId
-_pfnCallback: CESCALLBACK
-_pv: void <<destroy>>-CCompartment()
-_refCount: LONG +_ClearCompartment(): HRESULT
+_GetGUID(pguid: GUID): VOID
<<destroy>>-CCompartmentEventSink()
+_Unadvise(): HRESULT

图 3-3 语言栏模块类图

在文本服务框架下,操作文本需要获取文件锁,而文件锁需要通过执行编
辑会话来获取,所以定义了 session 基类和继承 session 基类以完成不同功能的
几个子类,CKeyHanderEditSession 负责发起按键处理的 session,每个按键处理
都需要发起一个回话,CGetTextExtentEditSession 完成获取输入光标位置,已
完成候选窗口跟踪光标的功能,GetAppPropertyEditSession 类完成获取当前焦
点窗口属性的作用,每个输入窗口有固定的属性,比如密码框,网址等,利用
这种信息,可以判断输入法环境,自动帮助用户切换中英文状态,例如在地址
栏中使用输入法,将自动切换输入法至英文状态,方便用户输入网址,回话类
的类关系如图 3-4 所示。

- 23 -
哈尔滨工业大学工程硕士学位论文

CKeyHandlerEditSession

-_uCode: UINT
-_wch: WCHAR

<<create>>-CKeyHandlerEditSession(pTextService: .. wch: WCHAR)


+DoEditSession(ec: TfEditCookie): STDMETHODIMP

CGetTextExtentEditSession CEditSessionBase
-_pContextView: ITfContextView #_pContext: ITfContext
-_pRangeComposition: ITfRange #_pTextService: CTextService
-_pTfTextLayoutSink: CTfTextLayoutSink -_refCount: LONG
+DoEditSession(ec: TfEditCookie): STDMETHODIMP <<destroy>>-CEditSessionBase()
+DoEditSession(ec: TfEditCookie): STDMETHODIMP

CGetAppPropertyEditSession

+DoEditSession(ec: TfEditCookie): STDMETHODIMP

图 3-4 编辑会话类图

3.3 按键映射模块设计与实现

按键映射模块是系统的核心模块,需要分析逻辑,判断系统状态,从而得
到每个按键功能,其他模块完成固定功能,并配合按键映射模块完成输入功能。

3.3.1 按键预处理

按键映射模块将接收到系统传递的所有键盘事件,需要根据系统所处的状
态来判断是否处理这个事件,不处理则交给系统进行默认处理。
系统状态将影响是否处理键盘事件,这样的系统因素较多,键盘是否可用,
键盘是否开启,这些是外部因素;内部因素和按键映射模块状态相关,状态即
输入状态包括空闲状态、输入状态、英文状态和网站状态。如系统处于非空闲
状态时,即写作串非空,则处理该按键,当系统处于空闲状态,并且虚拟按键
为符号,如数字键,则不处理该按键,由系统默认处理;传入的按键是虚拟键
值,功能键不能转换为 ascii 码值,将非功能键转换为 ascii 码值,便于处理。
处理流程如图 3-5 所示。

- 24 -
哈尔滨工业大学工程硕士学位论文

开始

传入按键消息


键盘是否可用


键盘是否开启

虚拟键值转换为
ascii码值


拼音串长度>0

按键转化引擎
事件

是 系统处于空
闲状态且传给引擎事
件为符号

引擎是否需要 否
该引擎事件

返回虚拟键值
和ascii值

接收按键消息,由 拒绝按键消息,
按键映射模块处理 由系统默认处理

结束

图 3-5 按键预处理流程

- 25 -
哈尔滨工业大学工程硕士学位论文

3.3.2 输入状态转换

输入状态:系统分为 4 种输入状态,即空闲状态、网址状态、中文状态和
英文状态。空闲状态即输入串为空,系统空闲状态。网址状态包含输入网址和
邮箱地址两种情况,进入状态引擎管理模块将返回一个最能匹配拼音串的候选
项,此时数字键和定义的翻页符将失效,将直接添加至拼音串,提交候选结果
是会将其加入用户词库中,没有候选结果而直接提交拼音串时,则将拼音串添
加至用户词库;当输入的拼音串提交给引擎管理模块时,返回多个候选项,则
进入中文状态,数字键和功能键生效;当输入的拼音串提交给引擎管理模块时,
没有返回候选项,则进入英文状态,数字键和功能键失效。输入状态转换如图
3-6 所示。
非英文字母 接收英文字母
形成有效英文串

提交符+上屏符号+退格符
空闲状态 中文状态
有效英文串

接收英文字母
形成无效英文串

提交符
无效英文串
退格符

退格符 提交符

接收“.”进入网址状态
英文状态 网址状态
引擎判断非网址,进入英文状态

非“.”,非提交符
其他符号

有效英文串,提交引擎候选数>1
无效英文串,提交引擎候选数<=1
提交符:空格、回车
上屏符号:中文状态下输入上屏符号则接近提交第一候选

图 3-6 输入状态转换

3.3.3 按键转换引擎事件

按键转换为引擎事件,体现按键映射模块中映射的部分,在此处完成较多
需求,特殊按键完成特定功能的映射在此处完成。有些按键在不同输入状态下,

- 26 -
哈尔滨工业大学工程硕士学位论文

完成不同的功能。
当用户输入英文字母时将提交给引擎,返回结果;当用户输入非英文字母
时,则根据当前输入状态判断其功能,在英文状态和网址状态下功能键失效,
在中文状态下生效。

开始

创建按键处理编辑
会话

按键类型

非ascii码值 一般按键
功能键 多功能按键

非ascii码值功 多功能按键 一般按键处理


能键处理流程 处理流程 流程

产生引擎事件

提交给引擎管
理模块

结束

图 3-7 按键转换引擎事件处理流程

功能键包含较多,要区分优选级。优先级最低的是“、”等符号,在中文状
态下时起到直接提交第一候选的作用,同时符号提交上屏;在系统处于空闲状
态时,即没有任何输入,会有一些特殊符号的映射,例如“Ctrl –”组合将输入
“——”;输入单引号和双引号时,要自动配对;退格键,需要传递给引擎管理
模块,来确定退格键的行为;单引号将起到切分符作用,传递给引擎管理模块,

- 27 -
哈尔滨工业大学工程硕士学位论文

切分符将拼音串切分成一个个音节,引擎也将根据这些音节转换成汉字,并显
示在候选窗口上;回车键将直接提交半选状态的拼音串,同时将提交用户输入
的切分符;空格键将提交处于焦点的候选;当用户配置了相应翻页功能键时,
如“+”和“-”,“[”和“]”,用户键入了翻页功能键,将直接传递给引擎管理
模块,识别为翻页操作;方向键的左右键用来移动拼音串的光标,移动光标会
影响候选内容,光标左侧的拼音串对应的候选仅在第一候选出现,光标右侧的
拼音串对应的候选出现在每个候选项,并与第一候选拼接显示;方向键的上下
键,将移动候选窗口候选项焦点,当焦点在本页的最后一项时,继续向后移动
焦点,则翻到下一页,当焦点在本页的第一项时,继续向前移动焦点,则翻到
上一页;数字键,输入数字键不超过候选窗口候选数时,提交那项候选,输入
数字超过候选窗口候选数时,进入英文状态。

开始

按键类型?

上下方向键 左右方向键 空格键 回车键 删除键 退格键

提交半选串,如
上方向键将候选 整句自由编辑, 整句自由编辑中
提交处于焦点的 输入“woshi”
焦点向前移动 即可以移动拼音 编辑拼音串,删
候选,默认焦点 选择候选为“我 系统做undo操作
下方向键将候选 串光标并编辑, 除光标后的字符
在第一候选 shi”按回车则
焦点向后移动 动态改变候选 ,动态改变候选
提交“我shi”

添加用户词

形成引擎事件

结束

图 3-8 非 ascii 码按键处理流程


在处理按键转换引擎事件需要涉及应用程序的文本上下文,处理上下文在
文本服务框架中,需要申请读写锁和编辑会话处理,这就需要创建自己的编辑

- 28 -
哈尔滨工业大学工程硕士学位论文

会话,根据按键类型不同进入不同处理子流程,即一般按键处理、多功能按键
处理和非 ascii 码按键处理,各个子流程处理结果产生引擎事件,并提交给引擎
管理模块处理。按键转换引擎事件处理如图 3-7 所示。

开始

按键类型?

A~Z “’” 其他符号


1~9 0
a~z

网址状态下,提交符 中文状态下进入
号,中文状态下超出候 单字模式,英文 判断系统全角半
选数提交符号,为超过 状态下提交符号 提交符号 提交切分符 角状态,提交不
则提交符号对于的候选 “0” 同符号

形成引擎事件

结束

图 3-9 一般按键处理流程
非 ascii 码按键需要处理的按键主要有退格键、空格键、回车键、方向键和
delete 键。上方向键将上一个候选项设问焦点项,下方向键将将下一个候选项
设问焦点项;左右方向键主要支持整句自由编辑,即可以移动拼音串光标,编
辑拼音串,动态改变候选词;空格键,提交处于焦点的候选,默认焦点在第一
候选;回车键,提交半选串,如输入“woshi”选择候选为“我 shi”按回车则
提交“我 shi”;删除键,在整句自由编辑中起到编辑拼音串作用,删除在拼音
串中位于光标之后的字符,同时动态改变候选;退格键,系统做 undo 操作,使
系统处于处理上一个操作符的状态。非 ascii 码按键处理流程如图 3-8 所示。
一般按键处理流程,既用于按键预处理部分中,判断是否在按键映射模块
中处理这个按键;也用于按键处理流程中,处理一般按键。一般按键,包括英

- 29 -
哈尔滨工业大学工程硕士学位论文

文字母、数字键、问号句号等键盘上的符号,处理流程如图 3-9 所示。


多功能按键处理流程,主要针对翻页功能键来说,如“[”和“]”具有多
种功能,英文状态提交半角符号;空闲状态下将直接提交符号,全角状态提交
全角符号,半角状态提交半角符号;中文状态下是翻页功能。具体多功能按键
处理流程如图 3-10 所示。

开始

翻页键
“-=”
“[]”

状态?

英文状态 其他状态 空闲状态

提交符号
符号为半角符号 翻页功能 提交符号

形成引擎事件

结束

图 3-10 多功能键处理流程

用户词库:按键映射模块每次响应提交候选时,将需要提交候选交由输入
服务模块处理,并且将提交的候选添加至用户词库,引擎管理模块中所管理的
引擎将会读取用户词库,用户词库的改变,直接影响词频进而改变候选结果,
提高候选准确率。用户词库中包含中文词、网址和邮箱地址等。

- 30 -
哈尔滨工业大学工程硕士学位论文

3.3.4 热键管理

按键映射模块提供热键功能,系统热键和自定义热键。系统热键是输入法
内置功能,例如 ESC 键将清除输入状态,Ctrl+.将切换输入法符号全角半角状
态。自定义热键将预留接口提供给用户设置个性化热键。实现需要在客户端第
一次加载时,将热键注册给系统;当用户触发热键时,客户端响应热键消息,
根据消息内容,并将消息分发给相应处理函数,当处理函数涉及与 UI 展现模
块交互的部分,如按 shift 按键将切换输入中英文状态,同时语言栏上的状态也
要相应变化。输入法结束服务时,需要将热键反注册。热键管理流程如图 3-11
所示。

开始

初始化系统

注册热键

响应热键

反注册热键

结束

图 3-11 热键管理流程

3.4 图形展现模块设计与实现

UI 展现模块是展现候选窗口和状态栏的模块,主要处理这两个窗口,该模
块需要使用到公共模块中的皮肤模块,皮肤模块负责将皮肤文件中的数据解析
并绘制出来,将绘制的视图提交给窗口,窗口处理点击事件,首先提交给皮肤
模块,皮肤模块根据坐标信息,判断点击的是哪个控件,通知调用他窗口,进

- 31 -
哈尔滨工业大学工程硕士学位论文

一步处理,而皮肤模块同时更新自己视图。其处理流程如图 3-12 所示。


UI 展现模块将窗口过程处理和和绘制分为两个模块,主要是绘制部分逻辑
相对较复杂,并且可以独立出来,成为独立模块,提供给 IME 框架和 TSF 框
架分别使用。

开始

窗口注册 创建

事件处理

提交坐标给皮肤模
块定位点击控件

窗口进行相关处理

结束

图 3-12 UI 展现模块处理逻辑

3.5 本章小结

本章根据需求分析和总体设计,将文本服务模块分为三个子模块,UI 展现
模块、按键映射模块和输入服务模块。着重论述了按键处理流程和响应文本服
务框架部分。

- 32 -
哈尔滨工业大学工程硕士学位论文

第 4 章 公共模块设计与实现

公共模块作为与框架无关的模块,提供给各个输入框架直接使用,间接减
少开发难度,公共模块包含引擎管理模块、设置工具和皮肤模块三个子模块。
引擎管理模块:将管理多个引擎;不同引擎之间的接口不统一,需要统一
引擎接口;需要将不同引擎提供候选结果进行二次排序;维护候选词本地缓存
实现翻页功能。引擎管理模块将获取的数据传递给 UI 展现模块进行显示。
设置工具:提供图形化界面对整个输入法进行设置、将设置的结果保存至
注册表、并实时应用于 UI 展现模块和按键映射模块、设置工具的初始化数据
通过读取注册表获得。需要维护配置信息主要输入方案、按键设置和输入法方
案。
皮肤模块:候选窗口绘制和事件响应、状态栏绘制和事件响应、将部分事
件传递给按键映射模块处理。

4.1 引擎管理模块

4.1.1 引擎管理层次划分

为了给用户提供更加准确的拼音候选,客户端需要在不同输入条件下整合
多个引擎产生结果,引擎管理模块完成这样的功能。引擎管理模块将管理拼音
引擎、云引擎、网址引擎、人名引擎等。
引擎管理模块封装为 3 个层次实现,每个层次实现不同功能,以便需求变
化和添加新引擎时,整体结构不会发生较大变化,降低模块之间的耦合性,增
强模块的可扩展性。这 3 个层次分别为输入服务、输入引擎和输入模式。他们
之间的关系如图 4-1 所示。

- 33 -
哈尔滨工业大学工程硕士学位论文

CInputService IInputEngine

CSymbolList CQQInputEngine
IInputMode

CQQInputContext CQQInputPinyinMode

CQQInputTipsCand CQQInputSortCand

图 4-1 引擎管理模块类关系图

(1)输入服务类
输入服务类是整个引擎管理模块的封装,封装后使整个模块相对独立,降
低耦合性,便于以后的升级管理。引擎管理模块管理多个引擎,输入服务类屏
蔽多个引擎所带来的差异性,降低使用的复杂性。当客户端其他模块使用引擎
管理模块时,将其视为唯一的独立引擎,即将用户输入的字符和操作,转化为
用户期待的一系列候选项。
输入服务类包含输入引擎和符号引擎,符号引擎是辅助输入引擎工作的引
擎,主要完成输入符号映射的工作,输入引擎是经过封装引擎。输入服务这一
层主要维护翻页功能和翻页的数据,将具体引擎的处理交由输入引擎统一处理。
翻页功能需要记录每个候选的串,以及翻页的索引,索引存储每一页对应于候
选的哪几项,同时记录当前展示的是哪一页以及焦点项。输入服务类提供,负
责初始化接口,访问候选数据接口,进行翻页、移动焦点项接口,输入服务类
的类图如图 4-2 所示。
(2)输入引擎类
输入引擎类包含若干输入模式,输入模式处理特定情景下的输入,例如五
笔输入模式、英文输入模式、拼音输入模式,将作为一个可扩展的结构存在,
当新需求出现时只需要实现一个新的输入模式类。输入引擎类中有一个

- 34 -
哈尔滨工业大学工程硕士学位论文

CInputService <<CppStruct>>
+Active() _SORTCAND_ITEM
+Deactivate() +nItemId: IM_UINT32
+SetFocus() +wEngineId: IM_WORD
+SetOption() +wReserved: IM_WORD
+GetOption()
+Reset()
+IsRequireKey()
+ProcessKey() <<CppSynonym>>
+SetPageIndex()
+GetPageIndex()
+SetSelection()
+MoveSelectionPrev() <<CppTypedef>>
+MoveSelectionNext() SORTCAND_ITEM
+MovePagePrev()
+MovePageNext()
+GetCompString()
+GetCompLen()
+GetCompCaretPos()
+MoveCompCaret() CQQInputEngine
+GetItemTotal()
+GetItemId()
+GetItemString()
+GetSelection()
+GetCurrentPage() CSymbolList
+IsLastPage()
+SelectItem() -m_nSingleQuoteNum: UINT
+SetItemType() -m_nDoubleQuoteNum: UINT
+GetItemType() -m_bMatchQuote: BOOL
+GetCommitString()
+GetCommitLen() <<create>>-CSymbolList()
+GetStatus() <<destroy>>-CSymbolList()
+GetTips() +GetSymbolId(wInputChar: WCHAR): INT32
+SetPunctuation() +GetEnSymChar(nSymId: INT32): WCHAR
-_ResetIndexRecord() +GetCnSymChar(nSymId: INT32): WCHAR
-_GetItemList() +IsCommitSym(wInputChar: WCHAR): BOOL
-_GetEngine() +BeginMatchQuote(): VOID
-_ProcessSymbol() +EndMatchQuote(): VOID
-_ProcessEnterKey() -_IsRightQuote(wInputChar: WCHAR): BOOL
-_UpdateContext()

图 4-2 输入服务类图

当前激活的概念,即同一时刻只有一个输入模式处于激活状态。输入引擎
会有多个输入模式存在,就会涉及模式切换问题。输入模式切换有两种情况,
一种是输入引擎类接收按键处理时,显式导致输入模式切换;另一种是在处理
完按键后,处于激活状态的输入模式,会返回当前模式的状态,输入引擎类根
据返回的状态信息,来判断是否需要切换输入模式。
由于输入引擎类的实例只有一份,而输入模式有多个实例,激活态的输入
模式只有一个,将候选信息存储到输入模式中将占据比较多内存空间,所以将
候选信息存储到输入引擎中,而让激活态的输入模式将候选信息填充其中。具
体如图 4-3 所示。

- 35 -
哈尔滨工业大学工程硕士学位论文

CQQInputEngine
CQQInputSortCand
-m_stInputMode: IInputMode
-m_pActiveMode: IInputMode -m_setCand: set<SORTCAND_ITEM_DATA>
-m_nDefModeId: IM_UINT32
-m_nModeTotal: IM_UINT32 <<create>>-CQQInputSortCand()
-m_iInputContext: CQQInputContext <<destroy>>-CQQInputSortCand()
+GetItemData()
<<create>>-CQQInputEngine() +GetItemTotal()
<<destroy>>-CQQInputEngine() +InsertItem()
+Initialize() +Reset()
+Terminate()
+SetOption()
+GetOption()
+SetInputString()
+GetInputString() CQQInputContext
+GetInputCursorPos()
-m_stSortCand: CQQInputSortCand
+ClearInputString()
-m_stTipsCand: CQQInputTipsCand
+GetCompString()
+GetCompCaretPos() <<create>>-CQQInputContext()
+SetCompCaretPos() <<destroy>>-CQQInputContext()
+MoveCompCaret() +GetSortCand()
+IsRequiredKey() +GetTipsCand()
+ProcessKey()
+PrepareItems()
+GetPreItemTotal()
+SelectItem()
CQQInputPinyinMode
+SetItemType()
+GetItemType()
+GetItemPhrase()
+GetItemEncode() <<CppStruct>>
+GetItemExtend() <<CppSynonym>> _SORTCAND_ITEM_DATA
+GetItemPhraseInfo()
+stItem: SORTCAND_ITEM
+GetCommitString() <<CppTypedef>> +wPriority: IM_WORD
+GetStatus() SORTCAND_ITEM_DATA +wPos: IM_WORD
+GetTips()
-_IsSwitchMode() <<CppOperator>>+<(my): bool
-_SwitchMode()

图 4-3 输入引擎类图

(3)输入模式
输入模式将多个符合同一输入情景的引擎实例整合到一起,例如拼音输入
模式,应该包括英文引擎、人名引擎、拼音引擎、云引擎等,本版本只包含拼
音引擎,其他引擎和输入模式将后续版本中添加。输入模式中需要管理多个引
擎,每个引擎都会产生候选,那么就要进行候选排序,根据不同情景下的输入
模式,不同的引擎实例提供的候选将根据不同的需求,具有不同的优先级。输
入模式将候选词优先级、来源于引擎实例 ID 和该引擎的位置,填充至输入引
擎类提供的 CQQInputSortCand 类中,并该类根据这些信息将候选词排序,最终
提供给外部使用。至于候选串信息存储于各个引擎实例中,因为频繁进行字符
串拷贝耗去较多时间,代价较高,所以使用记录下的引擎实例 ID 和在该引擎
内的位置,向其要字符串指针省去了字符串拷贝时间,速度较快。输入模式类
图如图 4-4 所示。

- 36 -
哈尔滨工业大学工程硕士学位论文

CQQInputPinyinMode
IInputMode <<create>>-CQQInputPinyinMode()
<<destroy>>-CQQInputPinyinMode()
<<destroy>>-IInputMode() +Initialize()
+Initialize() +Terminate()
+Terminate() +SetOption()
+SetOption() +GetOption()
+GetOption() +SetInputString()
+SetInputString() +GetInputString()
+GetInputString() +GetInputLen()
+GetInputCursorPos() +GetInputCursorPos()
+ClearInputString() +ClearInputString()
+GetCompString() +GetCompString()
+GetCompCaretPos() +GetCompCaretPos()
+SetCompCaretPos() +SetCompCaretPos()
+MoveCompCaret() +MoveCompCaret()
+IsRequiredKey() +IsRequiredKey()
+ProcessKey() +ProcessKey()
+PrepareItems() +PrepareItems()
+GetItemCount() +GetItemCount()
+SelectItem() +SelectItem()
+GetItemPhrase() +SetItemType()
+GetItemEncode() +GetItemType()
+GetItemExtend() +GetItemPhrase()
+GetItemPhraseInfo() +GetItemEncode()
+SetItemType() +GetItemExtend()
+GetItemType() +GetItemPhraseInfo()
+GetCommitString() +GetCommitString()
+GetStatus() +GetStatus()
-_InitializePY()
-_TerminatePY()
-_SetPYOption()
-_GetPYOption()

图 4-4 输入模式类图

4.1.2 处理逻辑

引擎管理模块管理着多个引擎,负责初始化引擎,并将用户输入的拼音串
传递给引擎,引擎返回候选词,传给 UI 展现模块。各个引擎维护着用户输入
拼音串的状态,并返回此状态下的候选词序列;引擎管理模块负责将对各个引
擎接口进行统一封装,方便按键映射模块调用,同时降低了系统耦合性,当各
个引擎接口变化时,仅需要修改引擎管理模块部分代码,不至于影响整个系统;
引擎管理模块还将对各个引擎提供的候选词序列管理,按照用户输入模式判断
候选词的顺序,如人名模式下,人名引擎提供的候选词有较大权重,会排在较
靠前位置;由于引擎不提供翻页功能,需要引擎管理模块在本地缓存一些候选
词数据,自己维护翻页功能,当用户的输入串发生变化时,各个引擎提供的数
据将发生变化,此时引擎管理模块的本地缓存候选词数据失效,需要清空,并
重新缓存数据。详情如 4-5 图所示。

- 37 -
哈尔滨工业大学工程硕士学位论文

开始

初始化各个引擎

从按键映射模块接
收消息

将消息分发给各个
引擎

是 否
拼音串是否变化

否 缓冲了需要的
清空本地候选词缓存 候选词?


从各个引擎中获取候选
词序列

获取输入模式,整理各
个引擎提供候选顺序,
并添加至缓存

返回候选词整理后结果
至UI展现界面

结束

图 4-5 引擎管理模块处理逻辑

- 38 -
哈尔滨工业大学工程硕士学位论文

4.2 皮肤模块

皮肤绘制模块主要完成绘制候选窗口和语言栏的功能。

4.2.1 皮肤文件简介

皮肤文件实际上是一个复合文件,其中打包了几个 XML 文件和多个 PNG


资源文件,XML 文件用来描述皮肤文件的绘制规则,PNG 文件则是需要绘制
的文件。
其中 skininfo-ver2.0.xml 描述了皮肤文件版本相关信息,详情如表 4-1 所示。
表 4-1 配置信息和注册表项对应表

键值 含义
fileName 文件名称
version 版本号
guid GUID 用来唯一标示皮肤的 ID
skinName 皮肤名称
description 皮肤介绍
style 格式
time 创建日期
author 作者
QQ 作者 QQ 号
email 作者电子邮箱地址
blog 作者博客地址
type 皮肤类型
frameSkin 皮肤框架

皮肤有着三种不同类型,有普通类型皮肤,带有相框的皮肤和动态类型的
皮肤,区别这些皮肤需要参考 type 和 frameSkin 字段,本文只针对普通类型的
皮肤处理。

- 39 -
哈尔滨工业大学工程硕士学位论文

4.2.2 皮肤文件解析

皮肤文件是复合文件采用第三方开源库 pole 解析成单独的文件,第三方开


源库 tinyxml 继续对 XML 文件进行解析,解析的结果统一存储在内存中,便于
使用,再次使用执行速度也比较快。
皮肤文件中的 skinConfig-unite-ver2.0.xml 用来描述候选窗口各个元素的绘
制方式,用 UniteDialog 类解释描述。skinConfig-status-ver2.0.xml 用来描述状
态栏,StatusDialog 类来描述。两者描述的方式相同,有较多共同元素,ImageBox
和 Button 是其中涉及到的两个类。
ImageBox 类中各个成员含义,如下表 4-2 所示。
表 4-2 ImageBox 成员解析表
成员 属性 含义
name name 控件的名称
Location Align 位置设定,对齐方式(参照对齐对象)(0-左
上,1-左中,2-左下,3-中上,4-中中,5-中下,6-右
上,7-右中,8-右下)
X 横向上相对参照对齐对象的预留空间
Y 纵向上相对参照对齐对象的预留空间
Size w 图片宽度
h 图片高度
Colorize colorize 图片颜色调节设定[0-不允许调节 1-可以调
节]
Stretch mode 图片拉伸时的方式[0-拉伸 1-平铺 2-不拉
伸]
left 图片拉伸时左端固定宽度
top 图片拉伸时上端定宽度
right 图片拉伸时右端固定宽度
bottom 图片拉伸时下端固定宽度
PY_ BKG PY_NORMAL 正常状态下的图形文件
PY_DISABLE 不可用时的图形文件

- 40 -
哈尔滨工业大学工程硕士学位论文

Button 类中各个成员含义,如下表 4-3 所示。


表 4-3 Button 成员解析表
成员 属性 含义
name name 控件的名称
Location Align 位置设定,对齐方式(参照对齐对象)(0-
左上,1-左中,2-左下,3-中上,4-中中,5-中
下,6-右上,7-右中,8-右下)
X 横向上相对参照对齐对象的预留空间
Y 纵向上相对参照对齐对象的预留空间
Size w 图片宽度
h 图片高度
TextMargin left 组词框中文本显示和窗体左边框的距离
Top 组词框中文本显示和窗体上边框的距离
right 组词框中文本显示和窗体左边框的距离
bottom 组词框中文本显示和窗体下边框的距离
Colorize colorize 图片颜色调节设定[0-不允许调节 1-可以
调节]
Stretch mode 图片拉伸时的方式[0-拉伸 1-平铺 2-不
拉伸]
left 图片拉伸时左端固定宽度
top 图片拉伸时上端定宽度
right 图片拉伸时右端固定宽度
bottom 图片拉伸时下端固定宽度
PY_ BKG PY_NORMAL 正常状态下的图形文件
PY_MOUSEOVER 鼠标滑过的图形文件
PY_PRESSED 按钮被按下的图形文件
PY_DISABLE 不可用时的图形文件
PY_UNDIFINE 按钮四合一的图形文件(规定按钮状态图
片等宽横向排布,顺序为:普通-鼠标滑过-
按下-无效])

- 41 -
哈尔滨工业大学工程硕士学位论文

UniteDialog 类中各个成员含义,如下表 4-4 所示。

表 4-4 UniteDialog 成员解析表


成员 属性 含义
name name 控件的名称
CompOffset X x 轴窗口相对给定屏幕坐标的偏移(为实
现组词框靠近屏幕光标位置)
Y y 轴窗口相对给定屏幕坐标的偏移(为实
现组词框靠近屏幕光标位置)
TextOutMargin left 组词框中文本显示和窗体左边框的距离
Top 组词框中文本显示和窗体上边框的距离
right 组词框中文本显示和窗体左边框的距离
bottom 组词框中文本显示和窗体下边框的距离
CompFont chfont_name 写作区中文字体名称
chfont_size 写作区中文字体大小
chfont_bold 写作区中文字体粗体
enfont_name 写作区中文字体名称
enfont_size 写作区英文字体大小
enfont_bold 写作区英文字体粗体
chinese_color 写作区中文字体颜色
english_color 写作区英文字体颜色
CandFont chfont_name 候选中文字体名称
chfont_size 候选中文字体大小
chfont_bold 候选中文字体粗体
enfont_name 候选中文字体名称
enfont_size 候选英文字体大小
enfont_bold 候选英文字体粗体
normal_color 候选非焦点项颜色
hot_color 候选焦点项颜色
Cursor color 输入框光标的颜色
weight 输入框光标的厚度
DividerLine left 分割线起点距离输入框的左边距
top 分割线距离输入拼音串下方的距离

- 42 -
哈尔滨工业大学工程硕士学位论文

表 4-4(续表)
成员 属性 含义
right 分割线起点距离输入框的右边距
bottom 分割线距离候选词上方的距离
Colorize colorize 图片颜色调节设定[0-不允许调节 1-可
以调节]
Stretch mode 图片拉伸时的方式[0-拉伸 1-平铺 2-
不拉伸]
left 图片拉伸时左端固定宽度
top 图片拉伸时上端定宽度
right 图片拉伸时右端固定宽度
bottom 图片拉伸时下端固定宽度
PY_ BKG PY_NORMAL 正常状态下的图形文件

StatusDialog 类中各个成员含义,如下表 4-5 所示。


表 4-5 StatusDialog 成员解析表
成员 属性 含义
name name 控件的名称
Size w 图片宽度
h 图片高度
Colorize colorize 图片颜色调节设定[0-不允许调节 1-
可以调节]
Stretch mode 图片拉伸时的方式[0-拉伸 1-平铺 2-
不拉伸]
left 图片拉伸时左端固定宽度
top 图片拉伸时上端定宽度
right 图片拉伸时右端固定宽度
bottom 图片拉伸时下端固定宽度
PY_ BKG PY_NORMAL 正常状态下的图形文件

- 43 -
哈尔滨工业大学工程硕士学位论文

4.2.3 皮肤绘制

皮肤文件解析出来的图片格式均为 PNG 格式,用 GDI 绘制不能起到很好


的效果,就采用开源 CxImage 类库,CxImage 类能处理多种文件格式,C++语
言实现且功能强大的图像管理类,提供给用户图像的导入、保存、显示和变换
等多种接口,方便快速实现使用。它是平台无关的,它是自由软件、免费的、
开源的,支持 BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS
等多种格式,支持几何变换、图像处理、图像格式转换等,功能强大,接口简
单使用方便。
窗口绘制部分从 UI 展现模块中抽象出来,成为一个独立的模块,功能独
立专一,便于支持添加皮肤的扩展。候选窗口中包含多个绘制元素,即背景图、
分割线、logo 图、输入串、候选项和按钮,其中按钮包括上翻页键和下翻页键;
状态栏窗口中包含背景图和按钮。窗口绘制部分将这些绘制元素都抽象为一个
对象,每个对象有相应的属性和方法,属性记录每个元素绘制的位置。窗口绘
制模块类图如图 4-6 所示。

CQQSkinBkg
CQQSkinCand

CQQSkinDivideline
CCandView CQQSkinComp

CQQSkinLogo
CQQSkinButton

图 4-6 窗口绘制模块类关系图
由于背景图要容纳所有元素,输入串和候选项的长度要根据实际内容变化,
要求背景图需要进行适当的伸展,完全伸展将会使背景图变的不美观,需将背
景图切分为九份,左上、左下、右上和右下四个角将不变,其余部分进行拉伸,
以适应窗口宽度。
对于按钮有 4 种状态,可用状态、不可用状态、按下状态,漫游状态。漫
游状态是当鼠标漫游到按钮上时,按钮图片会发生变化。在绘制模块中需要处
理鼠标点击和漫游而导致按钮状态的变化。需要将窗口获取的鼠标事件,传递
给窗口模块中进行进一步解析,在绘制模块中进行 UI 更新,同时给出反馈,
通知窗口操作的是哪一个界面元素,并将操作转换为引擎操作,交由引擎管理

- 44 -
哈尔滨工业大学工程硕士学位论文

模块处理。

4.2.4 皮肤模块处理逻辑

候选窗口是与用户交互的直接界面,将用户输入的拼音串和候选词展现出
来。而这些数据是通过引擎管理模块获取的,UI 展现模块只需要将这些数据展
现在候选窗口上,由于系统支持多个引擎使用,来自不同引擎的数据在绘制显
示时需要不同的标记,比如来自云拼音引擎的数据将在候选窗口处绘制一个
“云”状的小图标。整理这些数据并计算各个元素大小,得到绘制窗口大小。
候选窗口绘制流程如图 4-7 所示。

开始

绘制frame

绘制水平线,用于划
分拼音串和候选串

绘制拼音串,同时
绘制光标

计算候选宽度,区分
候选类型,根据类型
绘制不同候选项

绘制翻页键

结束

图 4-7 候选窗口绘制流程
由于要完成光标跟随需求,候选窗口应始终显示在输入光标位置的正下方。
需要实现文本服务框架接口,获取输入坐标,并实时更改候选窗口坐标,已完
成光标跟随功能。候选窗口需要处理一些鼠标事件完成点击候选项和点击翻页
键,处理时将这些鼠标事件转化为键盘消息传递给键盘映射模块已完成相应功
能。计算光标处理流程如图 4-8 所示。

- 45 -
哈尔滨工业大学工程硕士学位论文

开始

引擎管理模块
提供显示数据

根据数据计算候选
窗口宽度

获取当前输入坐标

判断候选窗口是否 否
绘制在屏幕之外


调整候选窗口位置,
使超出屏幕的部分紧
贴着屏幕边缘

响应鼠标事件,提交
消息至按键映射模块

结束

图 4-8 皮肤模块处理逻辑

皮肤绘制模块完成语言栏绘制功能和响应鼠标事件。绘制功能展现给用户
当前输入法的状态,即“中/英”、“全角/半角”、“中文符号/英文符号”。UI 展
现模块捕获鼠标事件,并将其转换为键盘消息传递给按键映射模块,完成输入
法状态切换功能。
皮肤模块主要完成输入法客户端图形元素的展现,包括状态栏和候选窗口,
皮肤模块主要管理状态栏和候选窗口两个对象。由于课题定位将来会同时支持

- 46 -
哈尔滨工业大学工程硕士学位论文

IME 和 TSF 两种输入框架,需要尽量将两者能够抽象的部分抽象出来,已达到


复用的目的,考虑到 IME 框架对窗口消息处理的部分和 TSF 框架有所不同,
而窗口绘制部分可以被公用,所以将状态栏窗口和候选窗口对象做同样处理,
将窗口事件处理部分和窗口绘制部分划分开。
窗口事件处理完成窗口拖动等一些窗口常规操作,同时完成从窗口事件到
引擎事件的转换功能,例如当点击翻页键时,将通知引擎管理模块执行翻页操
作;当点击候选项时,也将提交给引擎管理模块执行选取操作,引擎管理模块
判断后续操作行为。

4.3 设置工具

设置工具是方便用户配置输入法功能的可视化应用程序,主要完成“2.3
设置工具需求”中描述的功能,提供用户管理输入功能的可视化界面,同时负
责用户配置的持久化,通过将用户的配置信息存储到对应的注册表项中,下次
启动设置工具时,将读取注册表中信息并展现于设置界面中。每次更改输入法
设置时,都将实时的将设置信息通知到其他模块,将信息同步。如图 4-9 所示。

注册表

读取 保存

设置工具

同步

UI展现模块 输入服务模块 引擎管理模块 按键映射模块

图 4-9 设置界面处理逻辑

4.4 基本工具模块

基础工具模块,将作为一个基础类,对于其他模块来说,相当于工具箱,

- 47 -
哈尔滨工业大学工程硕士学位论文

使用其中每个类都能解决某一个特定的功能,并且这些抽象成公共模块的类,
都会在项目中频繁的使用,这样做使整个项目减少了很多功能相似的代码,是
整个项目更加简洁。

4.4.1 注册表管理

注册表管理类主要对 windows 注册表操作进行了抽象,将项目中可能会用


到的地方抽象成一个一个方法,例如 GetInstallPath 接口获取不带版本号的安装
路径,GetVersion 接口获取当前版本号信息,GetInstallFullPath 接口获取带版本
号的安装路径,GetAppDataPath 接口获取用户数据路径,该路径用来存储用户
词、皮肤等用户数据,GetDictPath 接口可以分别获取用户数据的词库路径和安
装路径下的词库数据。因此其他模块使用是只需要持有这个类,调用其中一个
接口就可以完成需求,同时注册表管理类通过下面四个接口即,
ReadRegKeyString 接口,WriteRegKeyString 接口,ReadRegKeyDWORD 接口
和 WriteRegKeyDWORD 接口屏蔽了 32 位系统和 64 位系统 windows 操作系统
之间的差异性。注册表管理类图如图 4-10 所示。

CQQInputRegMgr

<<create>>-CQQInputRegMgr(: void)
<<destroy>>-CQQInputRegMgr(: void)
+GetInstallPath(szPathString: LPTSTR, pStrLen: UINT32): BOOL
+GetVersion(szVerString: LPTSTR, pStrLen: UINT32): BOOL
+GetInstallFullPath(szPathString: LPTSTR, pStrLen: UINT32): BOOL
+GetAppDataPath(szPathString: LPTSTR, pStrLen: UINT32): BOOL
+GetDictPath(dwFlag: DWORD, szPathString: LPTSTR, pStrLen: UINT32): BOOL
+ReadRegKeyString(hKeyParent: HKEY, ..., szValue: LPTSTR, dwFlag: DWORD): BOOL
+WriteRegKeyString(hKeyParent: HKEY, .., szValue: LPCTSTR, dwFlag: DWORD): BOOL
+ReadRegKeyDWORD(hKeyParent: HKEY, ..., dwValue: DWORD, dwFlag: DWORD): BOOL
+WriteRegKeyDWORD(hKeyParent: HKEY, ..., dwValue: DWORD, dwFlag: DWORD): BOOL
-_GetLocateKeySam(dwFlag: DWORD): REGSAM

图 4-10 注册表管理类图

4.4.2 文件映射

每当有进程使用输入法时,便会加载词库,词库占用较多内存。因此多个
进程使用输入法时,将加载多份内存,这样将非常耗费内存。使用 windows 系
统 filemapping 机制,将词库以共享内存的方式,共享给各个进程,在整体上就
不会有内存浪费。文件映射模块将共享内存操作抽象出来,方便其他模块使用。
- 48 -
哈尔滨工业大学工程硕士学位论文

文件映射模块的类图如图 4-11 所示。

CQQInputFileMap

-m_pData: void
-m_nMappingSize: ULONG
-m_hMapping: HANDLE
-m_nOffset: ULARGE_INTEGER
-m_dwViewDesiredAccess: DWORD

<<create>>-CQQInputFileMap()
<<destroy>>-CQQInputFileMap()
+MapFile(hFile: HANDLE, nMappingSize: ULONG, ..., szName: PCTSTR, bIsGlobal: BOOL): HRESULT
+MapSharedMem(pszMappingName: PCTSTR, ..., bIsGlobal: BOOL): HRESULT
+Unmap(): HRESULT
+GetData(): void
+GetHandle(): HANDLE
+GetMappingSize(): ULONG
-_OpenMapping(szName: PCTSTR, ..., dwViewDesiredAccess: DWORD): HRESULT
-_HResultFromLastError(): HRESULT
-_FileNameToMapName(pFileName: LPCTSTR, pMapName: LPTSTR, nMapNameMaxLen: UINT): void

图 4-11 文件映射模块类图

4.4.3 词库管理

输入法包含多个词库,每个词库都需要加载,释放,这部分功能相对单一
其独立,适合于抽象成独立的模块,提供给其他模块使用。词库分为用户词库
和系统的词库,引擎需要将他们加载到内存中,词库较大每个进场都加载将占
用较多内存,此模块需要配合文件映射模块配合使用,以减少系统内存占用,
词库管理模块类图如图 4-12 所示。

CQQInputDicMgr

-m_stFileMap: CQQInputFileMap
-m_iRegMgr
-m_nMapTotal: UINT32

<<create>>-CQQInputDicMgr()
<<destroy>>-CQQInputDicMgr()
+GetInstance(): CQQInputDicMgr
+LoadDict(szDicFleName: PCTSTR, pBlock: IM_BLOCK, nFlag: UINT32): UINT32
+LoadAllDict(pBlock: IM_KERNEL_BLOCK, pBlockTotal: UINT32): BOOL
+LoadUserDict(pBlock: IM_BLOCK): BOOL
+FreeDict(nDicIndex: UINT32): BOOL
+FreeAllDict(): BOOL
+Reset(): VOID

图 4-12 词库管理模块类图

- 49 -
哈尔滨工业大学工程硕士学位论文

4.4.4 共享数据

不同应用使用本输入法时,各个应用的输入状态应该相同,例如中英状态、
中英标点状态、简繁状态以及状态栏的位置这些数据应该是全局的。需要记录
在共享数据中。共享数据模块类图如 4-13 所示。

<<CppStruct>> CQQInputShareData
_SHARE_DATA_MEM -m_iFileMap: CQQInputFileMap
+nLangId: UINT -m_pShareData: SHARE_DATA_MEM
+bCnUseEnSym: BOOL -m_bIsAlreadyExist: BOOL
+bSimpllifiedCn: BOOL <<create>>-CQQInputShareData()
+stStatusPos: POINT <<destroy>>-CQQInputShareData()
+GetInstance(): CQQInputShareData
+IsFirstInit(): BOOL
+GetLangId(): UINT
<<CppSynonym>> +SetLangId(nLangId: UINT): VOID
+IsCnUseEnSym(): BOOL
+SetCnUseEnSym(bUse: BOOL): VOID
<<CppTypedef>> +IsSimpllifiedCn(): BOOL
SHARE_DATA_MEM +SetSimpllifiedCn(bSimpllified: BOOL): VOID
+SetStatusPos(pt: POINT): BOOL
+GetStatusPos(pt: POINT): BOOL

图 4-13 共享数据模块类图

4.4.5 崩溃管理

程序在编写初期,由于开发人员的失误可能导致程序崩溃,特别是对于输
入法这种系统级的应用,崩溃可能导致使用的任意应用崩溃,造成不好的效果。
出于这种考虑,基本工具模块中提供了崩溃管理器,其原理是记录发生 Crash
时,记录当前调用栈中的信息,并将这些信息写入一个“.dmp”格式的文件中,
写入文件时,同时记录当前发生 crash 的时间和版本信息,可以唯一标示一个
dmp 文件,当用户大量使用时,一旦发生 crash 时,便能记录这个问题,将 dmp
文件发送给开发人员分析,对于那个不易复现的错误,处理来说特别有效。处
理流程如图 4-14 所示。

- 50 -
哈尔滨工业大学工程硕士学位论文

开始

系统产生crash

捕获crash

记录产生crash时
间,产生版本

将crash时栈信息
写入dmp文件中

结束

图 4-14 崩溃处理流程图

4.4.6 配置管理

输入法有一些配置信息,如中英状态,简繁体状态等,这些配置信息存储
于全局数据结构中,在启动输入法时需要加载这些信息,根据这些信息将输入
法进行初始化,并在事件处理时,根据不同配置有着不同的行为。
配置管理类提供多个接口,Loadconfig 接口将配置信息从注册表中加载到
内存数据结构中,LoadDefaultConfig 接口将默认配置信息从注册表中加载到内
存 数 据 结 构 中 , SaveConfig 接 口 将 内 存 中 配 置 信 息 写 入 到 注 册 表 中 ,
FillServiceOption 接口将配置信息中引擎管理模块所需的信息提取出来,之后传
递给引擎管理模块,InstallConfig 接口提供给初始安装输入法时使用,将默认
信息写入到注册表中,同时判断正在使用中的配置信息是否完整,若不完整则
将默认信息写入,否则什么都不做,类图如图 4-15 所示。

- 51 -
哈尔滨工业大学工程硕士学位论文

<<CppStruct>> <<enumeration>>
_INPUT_OPTION <<CppTypedef>> _CONFIG_PARENT_KEY <<CppSynonym>> <<CppTypedef>>
INPUT_OPTION
+bInitChinese: BOOL +CONFIG_LOCAL_MACHINE CONFIG_PARENT_KEY
+bCnUseEnSym: BOOL <<CppSynonym>>
+CONFIG_CURRENT_USER
+bInitSimplified: BOOL
+bFuzzy: BOOL
+dwFuzzyBitset: DWORD
+bSwitchLangEnable: BOOL CQQInputConfigMgr
+dwSwitchLangKey: DWORD
+bSwitchShapeEnable: BOOL -m_iRegMgr: CQQInputRegMgr
+dwSwitchShapeKey: BOOL <<create>>-CQQInputConfigMgr(: void)
+bSimToTraEnable: BOOL <<destroy>>-CQQInputConfigMgr(: void)
+dwSimToTraKey: DWORD +LoadConfig(pInputOption: INPUT_OPTION): BOOL
+bCameraEnable: BOOL +LoadDefaultConfig(pInputOption: INPUT_OPTION): BOOL
+dwCameraKey: DWORD +SaveConfig(pInputOption: INPUT_OPTION): BOOL
+dwTurnPageKey: DWORD +FillServiceOption(pServicOption: SERVICE_OPTION, pInputOption: INPUT_OPTION, IsFirstLoad: BOOL): BOOL
+bSwitchQQEnable: BOOL +InstallConfig(eParentKey: CONFIG_PARENT_KEY): BOOL
+dwSwitchQQKey: DWORD -_FillFuzzyValue(pDestValue: UINT32, nSourceValue: UINT32): BOOL
-_LoadConfig(pInputOption: INPUT_OPTION, eParentKey: CONFIG_PARENT_KEY): BOOL

图 4-15 配置管理类图

设置工具同样加载这些配置信息,配置信息保存在对应的注册表项中。如
表所示。当用户通过设置工具改变配置信息时,设置工具将把这些信息写入到
注册表中。配置信息和注册表项对应表如表 4-6 所示。
表 4-6 配置信息和注册表项对应表
键值 含义
bInitChinese 语言:中文/英文
bCnUseEnSym 是否在中文状态下使用英文标点
bInitSimplified 初始 为简体(或繁体)
bFuzzy 是否使用模糊音
dwFuzzyBitset 具体的模糊音方案
bSwitchLangEnable 中英文切换,为 0 表示不开启此功能
dwSwitchLangKey 中英文切换,shift or ctrl
bSwitchShapeEnable 全半角切换,为 0 表示不开启此功能
dwSwitchShapeKey 全半角切换 (保留项)
bSimToTraEnable 简体/繁体快捷键,为 0 表示不开启此功能
dwSimToTraKey 简体/繁体快捷键,值(A~Z)
bCameraEnable 截屏快捷键,为 0 表示不开启这个功能
dwCameraKey 截屏快捷键,值
dwTurnPageKey 候选翻页快捷键
bSwitchQQEnable 热键切换至 QQ 拼音,为 0 表示不开启此功能
dwSwitchQQKey 热键切换至 QQ 拼音,值

- 52 -
哈尔滨工业大学工程硕士学位论文

4.5 系统应用效果

4.5.1 皮肤绘制界面

输入法客户端可以加载多套皮肤文件,来绘制不同皮肤,取其中两套皮肤
作为展示,默认皮肤效果图如 4-16 所示,小熊梦工厂皮肤效果图如 4-17 所示。

图 4-16 默认皮肤效果图

图 4-17 小熊梦工厂皮肤效果图

4.5.2 设置工具界面

设置工具实现了基本设置功能、按键设置功能和输入法管理器,基本功能
实现效果如图 4-18 所示。按键设置功能实现效果如图 4-19 所示。输入法管理
器实现效果如图 4-20 所示。

- 53 -
哈尔滨工业大学工程硕士学位论文

图 4-18 基本设置功能效果图

图 4-19 按键设置功能效果图

- 54 -
哈尔滨工业大学工程硕士学位论文

图 4-20 基本设置功能效果图

4.6 本章小结

本章讨论了公共模块,将其分为引擎管理模块、皮肤模块、设置工具和基
本工具模块,各个子模块都具有一定的通用性,以提供给上层输入法框架相关
的文本服务模块使用。

- 55 -
哈尔滨工业大学工程硕士学位论文

第 5 章 系统测试

5.1 测试环境

(1)硬件环境:
CPU:AMD Phenom™ II X4 830 Processor
主频:2.80 GHz
内存:4GB
硬盘:500GB
显示器:19 寸
(2)软件环境:
操作系统:Windows 8 (64 位操作系统)
开发环境:Visual Studio 2012

5.2 功能性测试

本节将对需求分析中提到的功能点进行测试,对于不同类型的功能点将分
为基本输入功能测试,设置工具测试和输入环境测试。

5.2.1 基本输入测试

基本输入测试将覆盖基本输入需求所提及的功能点进行一一验证,确保其
供能符合需求。
5.2.1.1 符号映射测试
本节主要对按键处理过程中符号映射部分进行的测试。一部分符号映射到
候选窗口的写作区,一部分符号直接提交。
将输入法切换到中文状态下,空闲输入混合输入大写英文和数字,表 5-1
和表 5-2 是相对应的两个测试用例。

- 56 -
哈尔滨工业大学工程硕士学位论文

表 5-1 中文状态下输入大写英文和数字测试用例一
测试用例编号 1.1
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态,至空闲状态
2. 输入“1”
3. 输入“A”
预期结果 数字 1 直接上屏,然后大写字母 A 上
实际结果 与预期结果相同

表 5-2 中文状态下输入大写英文和数字测试用例二
测试用例编号 1.2
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 输入“A”
预期结果 大写字母 A 进入写作串,同时产生候选
实际结果 与预期结果相同

标点符号配对是用户经常使用的一个功能,引用一句话或者一个词时,引
号自动配对将为用户提供方便,表 5-3 是标点配对的测试用例。
表 5-3 标点配对测试用例
测试用例编号 1.3
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入“
3. 输入 haerbin
4. 输入”
预期结果 上屏“哈尔滨”,双引号成功匹配
实际结果 与预期结果相同

- 57 -
哈尔滨工业大学工程硕士学位论文

智能句点功能将用户输入数字后直接输入“.”,无论当时处于全角或者半
角状态,提交的均为半角“.”,表 5-4 是智能句点测试用例。
表 5-4 智能句点测试用例
测试用例编号 1.4
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 将符号切换至中文符号
3. 输入“1”
4. 按“.”键
预期结果 上屏“1.”
实际结果 与预期结果相同

当输入法写作区有数据时,按下“0”,进入单字模式,所有候选项均为一
个字,再次按下“0”时,退出单字模式,表 5-5 是单字模式测试用例。
表 5-5 单字模式测试用例
测试用例编号 1.5
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 输入“0”
预期结果 候选窗口全部为一个字的候选项
实际结果 与预期结果相同

表 5-6 中英符号输入测试用例一
测试用例编号 1.6
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 将符号切换至中文符号
3. 输入“,”
预期结果 上屏“,”
实际结果 与预期结果相同

- 58 -
哈尔滨工业大学工程硕士学位论文

在中英文语言环境下,同一符号可以映射为不同的符号,以支持支持中文、
英文符号的输入,表 5-6 和表 5-7 是中英符号输入的两个测试用例。

表 5-7 中英符号输入测试用例二
测试用例编号 1.7
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 将符号切换至英文符号
3. 输入“,”
预期结果 上屏“,”
实际结果 与预期结果相同

验证中英文状态和中英符号直接的关系,中文切换到英文,中文符号会自
动切换至英文符号,表 5-8 是中英状态与中英符号的测试用例。

表 5-8 中英状态与中英符号测试用例
测试用例编号 1.8
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 将符号切换至中文符号
3. 切换至英文状态
预期结果 进入英文状态,同时符号也切换至英文符号
实际结果 与预期结果相同

5.2.1.2 候选提交测试
用户输入产生候选项,可以通过多种方式将用户想要的候选项提交。
鼠标作为用户一种便捷的操作方式,输入法提供给用户通过鼠标点击,选
候选项,并提交,表 5-9 是鼠标选词测试用例。

- 59 -
哈尔滨工业大学工程硕士学位论文

表 5-9 鼠标选词测试用例
测试用例编号 1.9
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 点击第一个候选“哈尔滨”
预期结果 候选项“哈尔滨”上屏提交
实际结果 与预期结果相同

按空格键将候选窗口中处于焦点的候选项提交,表 5-10 是空格上屏的测试


用例。
表 5-10 空格上屏测试用例
测试用例编号 1.10
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 按空格键
预期结果 处于焦点的候选项上屏提交
实际结果 与预期结果相同

当候选窗口的写作区非空时,输入用户比较经常使用一些符号可以将处于
焦点的候选项直接提交,表 5-11 是符号上屏的测试用例。
表 5-11 符号上屏测试用例
测试用例编号 1.11
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 将符号切换至中文符号
3. 输入 haerbin
4. 输入“,”
预期结果 处于焦点的候选项上屏,中文符号“,”上屏
实际结果 与预期结果相同

- 60 -
哈尔滨工业大学工程硕士学位论文

按候选窗口的候选项对应的数字键,可以将对应的候选项提交,表 5-12 是
数字选词的测试用例。
表 5-12 数字选词测试用例
测试用例编号 1.12
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 输入“2”
预期结果 候选窗口第二个候选项上屏提交
实际结果 与预期结果相同

5.2.1.3 候选翻页测试
输入法提供两种方式进行候选翻页操作,即快捷键翻页和鼠标翻页。
在设置工具中将翻页快捷键设置生效,翻页快捷键有 4 组,表 5-13 是快捷
键翻页的其中一个测试用例。
表 5-13 快捷键翻页测试用例
测试用例编号 1.13
测试类型 功能测试
前置条件 无
测试步骤 1. 打开输入法设置工具,将使“[”、“]”生效
2. 将输入法切换至中文状态
3. 输入 haerbin
4. 分别按“[”、“]”键
5. 返回 1,依次使“-”、
“=”,
“,”、
“。”,
“Tab”、
“Shift+Tab”
生效。
预期结果 候选窗口中候选项向前、向后翻页,同时更新候选项
实际结果 与预期结果相同

使用鼠标点击候选窗口的翻页按钮,使候选项更新翻页,是输入法翻页的
一种方式。表 5-14 是鼠标翻页的测试用例。

- 61 -
哈尔滨工业大学工程硕士学位论文

表 5-14 鼠标翻页测试用例
测试用例编号 1.14
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 鼠标点击候选窗口翻页键
预期结果 候选窗口翻页并更新候选项
实际结果 与预期结果相同

5.2.1.4 显示更新测试
一些用户操作导致候选窗口显示更新。
退格键删除写作区光标前一个字符,候选窗口显示更新相应写作串和候选
项,表 5-15 是退格键删除拼音测试用例。
表 5-15 退格键删除拼音测试用例
测试用例编号 1.15
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 按退格键
预期结果 删除写作串光标位置左边的拼音字母,写作串变为“haerbi”
实际结果 与预期结果相同

表 5-16 光标移动测试用例
测试用例编号 1.16
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 多次按左方向键和右方向键
预期结果 光标在写作串中移动,候选窗口同时将其更新
实际结果 与预期结果相同

- 62 -
哈尔滨工业大学工程硕士学位论文

当点击方向键时,候选窗口的写作区和候选项的焦点会做出相应变化,候
选窗口显示内容更新,表 5-16 是光标移动的测试用例。表 5-17 是方向键变换
焦点候选项测试用例。
表 5-17 方向键变换焦点候选项测试用例
测试用例编号 1.17
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 haerbin
3. 按左右方向键
预期结果 候选窗口焦点候选项变换,按左方向键焦点向左移动,按
右方向键焦点向右移动。
实际结果 与预期结果相同

用户在输入文字过程中,文本中的光标表明当前输入位置,候选窗口的位
置靠近光标位置,方便用户输入,当光标位置变化时,候选窗口跟随光标位置,
表 5-18 是光标跟随测试用例。
表 5-18 光标跟随测试用例

测试用例编号 1.18
测试类型 功能测试
前置条件 无
测试步骤 1. 打开记事本,将输入法切换至中文状态
2. 输入 haerbin
3. 移动记事本
4. 输入 gongye
预期结果 每次输入候选窗口均在光标下方
实际结果 与预期结果相同

写作区变化和候选翻页将导致候选窗口内容变化,同时实时更新,表 5-19
是实时显示的测试用例。

- 63 -
哈尔滨工业大学工程硕士学位论文

表 5-19 实时显示测试用例
测试用例编号 1.19
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 h
3. 输入 a
预期结果 写作串从“h”变化为“ha”时,候选窗口中的写作区的写
作串立即更新,同时候选区的候选词立即调整更新。
实际结果 与预期结果相同

动态词频是输入法的基本特性,用户每次提交的候选词,都将记录到用户
词中,引擎根据用户词的词频动态调整候选项的顺序,表 5-20 是动态词频的测
试用例。
表 5-20 动态词频测试用例
测试用例编号 1.20
测试类型 功能测试
前置条件 无
测试步骤 1. 将输入法切换至中文状态
2. 输入 women
3. 选中“我”
4. 经过几次翻页选择“懣”候选项
5. 再次输入 women
预期结果 “我懣”出现在第一页候选中,证明产生用户词,词频动
态更改
实际结果 与预期结果相同

输入法维持全局输入状态,即中英文状态、中英符号、简繁体,全局输入
状态使用户在切换应用时,所有切换到当前输入法的应用都拥有相同状态,表
5-21 是全局输入状态测试用例。

- 64 -
哈尔滨工业大学工程硕士学位论文

表 5-21 全局输入状态测试用例
测试用例编号 1.21
测试类型 功能测试
前置条件 无
测试步骤 1. 打开记事本,将输入法切换至中文状态
2. 打开 doc,将输入法切换至英文状态
3. 切换到记事本
预期结果 记事本输入法状态为英文状态,维持全局输入状态
实际结果 与预期结果相同

5.2.1.5 皮肤绘制测试
输入法默认皮肤是蓝色调的,将小熊梦工厂皮肤文件设置激活的皮肤文件,
打开新应用,切换至当前输入法,输入法皮肤同时更新,变成小熊梦工厂风格
的状态栏和候选窗口。
综上,经测试用例验证,基本输入需求功能点全部完成,达到预期要求。

5.2.2 设置工具测试

设置工具测试将覆盖设置工具需求所提及的功能点进行一一验证,确保其
供能符合需求。表 5-22 至表 5-27 为设置工具测试用例。
设置语言初始状态,表 5-22 是其测试用例,进行验证。

表 5-22 设置语言初始状态测试用例

测试用例编号 1.22
测试类型 功能测试
前置条件 第一次使用输入法,处于初始状态
测试步骤 1. 打开设置工具,将初始语言设置为“中”
2. 打开记事本,启动输入法
预期结果 记事本输入法状态为中文状态
实际结果 与预期结果相同

- 65 -
哈尔滨工业大学工程硕士学位论文

表 5-23 是设置简繁初始状态的测试用例。

表 5-23 设置简繁初始状态测试用例
测试用例编号 1.23
测试类型 功能测试
前置条件 第一次使用输入法,处于初始状态
测试步骤 1. 打开设置工具,将初始简繁体设置为“繁体”
2. 打开记事本,启动输入法
预期结果 记事本输入法状态为繁体状态
实际结果 与预期结果相同

表 5-24 模糊音设置测试用例
测试用例编号 1.24
测试类型 功能测试
前置条件 无
测试步骤 1. 打开设置工具,点击模糊音设置按钮,开启“s = sh”、
“r
= l”、“f = h”三个规则。
2. 打开记事本,启动输入法
3. 输入 su’lu’ha
预期结果 候选中会有输(shu)入(ru)法(fa)。
实际结果 与预期结果相同

表 5-25 配置翻页键测试用例
测试用例编号 1.25
测试类型 功能测试
前置条件 无
测试步骤 1. 打开设置工具,开启“逗号句号”、“减号等号”
2. 打开记事本,启动输入法
3. 输入 haerbin
4. 点击逗号,句号,加号,减号键
预期结果 候选项翻页并更新
实际结果 与预期结果相同

- 66 -
哈尔滨工业大学工程硕士学位论文

表 5-26 热键设置测试用例
测试用例编号 1.26
测试类型 功能测试
前置条件 当前输入状态为简体状态
测试步骤 1. 打开设置工具,勾选“简体/繁体切换”,并设置快捷键
为“F”。
2. 打开记事本,启动输入法
3. 按 Ctrl + Shift + F
4. 输入 haerbin
预期结果 候选中会有“哈爾濱”。
实际结果 与预期结果相同

表 5-27 恢复默认设置测试用例
测试用例编号 1.27
测试类型 功能测试
前置条件 无
测试步骤 1. 打开设置工具,点击“恢复默认设置”按键
预期结果 设置项更新,并且恢复到默认设置
实际结果 与预期结果相同

综上,经测试用例验证,设置工具需求功能点全部完成,达到预期要求。

5.2.3 输入环境测试

输入环境测试将覆盖输入环境需求所提及的功能点进行一一验证,确保其
供能符合需求。表 5-28 至表 5-31 为输入环境测试用例。
表 5-28 普通文本输入测试用例

测试用例编号 1.28
测试类型 功能测试
前置条件 无
测试步骤 1. 打开设置工具,将初始语言设置为“中”
2. 打开记事本,启动输入法
预期结果 记事本输入法状态为中文状态
实际结果 与预期结果相同

- 67 -
哈尔滨工业大学工程硕士学位论文

表 5-29 DOS 窗口输入测试用例


测试用例编号 1.29
测试类型 功能测试
前置条件 无
测试步骤 1. 启动 CMD 程序。
2. 启动输入法,进行输入。
预期结果 CMD 程序输入正常可以使用
实际结果 与预期结果相同

表 5-30 Metro 界面输入测试用例一

测试用例编号 1.30
测试类型 功能测试
前置条件 Windows 8 操作系统
测试步骤 1. 按 window 键进入 Metro 界面
2. 输入文字,进入 Metro Search 界面
预期结果 可以正常使用
实际结果 与预期结果相同

表 5-31 Metro 界面输入测试用例二

测试用例编号 1.31
测试类型 功能测试
前置条件 Windows 8 操作系统
测试步骤 1. 按 window 键进入 Metro 界面
2. 点击 Bing 应用,启动输入法,输入文字
预期结果 可以正常使用
实际结果 与预期结果相同

综上,经测试用例验证,输入环境需求功能点全部完成,达到预期要求。

5.3 兼容性测试

兼容性测试是被测试对象能够在不同的操作系统,不同的应用软件,不同
的网络等环境中正常运行的测试。不同的操作系统正常运行,指能在同一操作
系统的不同版本上正常运行;能与相关的其他软件互补干扰,正常运行;能在

- 68 -
哈尔滨工业大学工程硕士学位论文

不同的网络环境中正常运行。兼容性测试是无法做到完全的质量保证,但对于
多数项目来讲,兼容性测试在整个测试环节中必不可少。
输入法的兼容性表明输入法可以使用的场合和环境,是输入法一个重要的
技术指标,本节将对较常用的应用和比较火爆的游戏进行兼容性测试。
测试结果如下:
1. 针对主流浏览器包括 chrome、搜狗浏览器、IE8、IE9、IE10、QQ 浏览
器,同时对百度、淘宝、天猫、腾讯网等常用站点访问,测试表现良好。
2. 对常用软件包括 QQ、记事本、outlook、资源管理器、Word、Excel 等
进行测试,输入法正常使用。
3. 对主流游戏包括地下城与勇士、御龙在天、轩辕传奇、剑灵、天涯明月
刀、英雄联盟、逆战、QQ 游戏、QQ 飞车、QQ 炫舞、QQ 炫舞 2 等游
戏进行测试,输入法均能正常使用。

5.4 本章小结

本章首先对描述了测试环境,然后进行了功能性测试,验证了输入法满足
每个需求,完成了整个输入法的基本功能。兼容性测试结果表明,输入法在常
用软件和主流游戏上表现良好,比较健壮,证明了输入法的可用行。

- 69 -
哈尔滨工业大学工程硕士学位论文

结 论

中文内容在互联网慢慢发展,并逐渐起到主导作用,中文输入的重要性也
越来越突出。输入法作为基础应用软件使人们的日常工作和生活更加便捷,尤
其是拼音输入法作为普通用户最为熟悉的输入方式,对于用户意义更加深远。
一款简洁实用方便的拼音输入法显得尤为重要。完成基于文本服务框架的拼音
输入法客户端需求分析、总体设计、各个子模块的设计与实现并进行了系统测
试方面工作,本课题完成的成果如下:
(1)支持文本服务框架,文本服务框架是一种新的输入法框架,是一个与
输入设备无关、与语言无关的可扩展系统,用以向文本输入和语言处理技术提
供服务。
(2)根据特定的需求对整个项目进行模块划分,在完成现有需求的基础上,
同时兼顾以后将要开发使用的模块,考虑平台及输入框架的差异性,设计好公
共模块的接口,方便后续开发工作。
(3)引擎管理,管理多个引擎;不同引擎之间的接口不统一,需要统一引
擎接口;需要将不同引擎提供候选结果进行整理;维护候选词本地缓存实现翻
页功能。皮肤模块将根据皮肤文件中获取的数据和指定的规则,将候选窗口和
状态栏绘制出来。
(4)基础工具,将作为一个基础类,对于其他模块来说,相当于工具箱,
使用其中每个类都能解决某一个特定的功能,并且这些抽象成公共模块的类,
都会在项目中频繁的使用,这样做使整个项目减少了功能相似的代码,使整个
项目更加简洁。
(5)对整个输入法客户端进行功能性测试,保证项目符合需求,同时进行
兼容性测试,保证项目的健壮性,通过对本输入法进行测试,完全项目符合预
期。
系统可以从以下几个方面进行改进:
(1)设置工具功能待完善,目前只完成了基本设置、按键设置和输入法管
理模块,还需要完成词库设置、皮肤设置和账户设置。
(2)皮肤模块只支持普通皮肤,还需要支持带有相框的皮肤,和动态皮肤。
(3)默认皮肤和设置工具的布局需要在后期根据视觉设计进行修改。
系统从整体上完成了需求,达到项目预期,有实际意义,经过进一步改进,
可以提供用户进行使用。

- 70 -
哈尔滨工业大学工程硕士学位论文

参考文献

[1] 陆莲芳,巴力登. Windows 平台的汉字输入法程序设计技术[J]. 微型电脑应


用,2005,21(3):25-28.
[2] 李培峰,朱巧明. 析 Windows 95/98/NT 平台多文种 IME 的设计技术[J]. 计
算机工程与科学,2000,22(4):67-70.
[3] 胡宇晓,马少平,夏莹. 基于 IMM-IME 输入法接口的实现方法[J]. 计算机
工程与应用,2002(1):117-124.
[4] 丁士正。输入法的接口设计及实现[D]. 学士学位论文. 北京:清华大学计
算机系,2000.
[5] 胡遇杰,宋军强,杨煜普. 自定义中文输入法的自动安装[J]. 计算机系统
应用,2000(12):48-50.
[6] Takahide Honma,Hiroyoshi Baba,Kuniaki Takizawa.Japanese Input Method
Independent of Applications. 1993
[7] Zheng Chen,Kai Fu Lee. A new Statistical Approach to Chinese Pinyin Input,
ACL,HongKong,2000:27-44.
[8] QuYouli,FanXiaozhong.A Chinese Input Form Based on Keyboard Combining
Words And Sentences,COMPUTER ENGINEERING & SCIENCE,2002,22
(4):61-63.
[9] 周克兰,吕强,张玉华,等. 试论汉字数字输入法评价[J]. 中文信息学报,
2007,21(1).
[10] 李亭骞,曹渠江. Windows 平台下的汉字输入法机制及应用[J]. 计算机应用
与软件. 2006(01)
[11] 孙文庆,刘秉权,肖镜辉. 基于内存映射文件的数据共享技术研究与应用
[J]. 微计算机应用,2005,26(2):192-194.
[12] Krueger M H, Neeson K D. Japanese text input method using a limited roman
character set: U.S. Patent 6,098,086[P]. 2000-8-1.
[13] Krueger M H, Neeson K D. Japanese text input method using a keyboard with
only base kana characters: U.S. Patent 5,999,950[P]. 1999-12-7.
[14] 朱巧明,李培峰,杨季文,吕强,钱培德. 基于 Windows9x/2000/NT 平台
汉字输入法的设计[J]. 小型微型计算机系统. 2000(11)
[15] 张小衡. 不完全拼音码的模版处理--兼谈微软拼音输入法的进一步完善

- 71 -
哈尔滨工业大学工程硕士学位论文

[J]. 计算机工程与应用,2005,41(20):74-101.
[16] 徐英慧. 基于 Qtopia 的嵌入式智能拼音输入法设计[J]. 微计算机信息,
2008,24(10):3-3.
[17] Frank Siegemund, Muhammad Haroon."Using Digital Cameras for Text Input
on Mobile Devices,". Fifth IEEE International Conference on Pervasive
Computing and Communications (PerCom’’07). 2007
[18] Rick W.K. Ha,Pin-Han Ho,X Sherman Shen.SIMKEYS:An Efficient Approach
in Text Entry for Mobile Communications. Consumer Communications and
Networking Conference . 2004
[19] 陈一凡,朱亮. 汉字键盘输入智能处理软件综述[J]. 中文信息学报,2003,
17(2):60-65.
[20] 闵华松,童学才,陈启卷. 嵌入式中文输入法设计[J]. 微计算机信息,2006,
22(23):41-43.
[21] 殷芳刚,吴建国,吴海辉,等. Windows Mobile 平台下智能手机输入法研
究[J]. 计算机技术与发展,2011(5):021.
[22] Microsoft.Win32 Multilingual IME Application Programming Interface
[M].2003.
[23] Microsoft Corp.Win32 Muhilingual IME Application Programming Intefrace
[M].1998
[24] Masahiko Narita,Hideki Hiura.The Input Method Protocol, Version 1.0, X
Consortium Standard, X Version 11, Release 6.4. . 1994
[25] Hideki Hiura.Internet/Intrnet Input Method Architecture. . 1999
[26] Andi Wu,Zixin Jiang.Statistically-Enhanced New Word Identification in a
Rule-Based Chinese System. . 2000
[27] 潘阿荣. 基于 Windows Mobile 的智能手机汉字输入法研究[D]. 哈尔滨工业
大学 2006
[28] 刘必强. 基于 Smartphone 的智能手机输入法的研究与实现[D]. 哈尔滨工业
大学 2006
[29] Hokyoung Ryu,Katrina Cruz.LetterEase: Improving Text Entry on a Handheld
Device via Letter Reassignment. 2005
[30] Zheng Chen,Mingjing Li,Kai-Fu Lee.Discriminative Training on Language
Model. 2000
[31] Bing-Quan Liu,Xiao-Long Wang.An Approach to Machine Learning of Chinese
Pinyin-To-Character Conversion for Small-MemoryApplication. 2002

- 72 -
哈尔滨工业大学工程硕士学位论文

[32] 吕肖庆. 超大字库输入法的实现[J]. 微型电脑应用. 2001(02)


[33] 袁哲. 人工智能在拼音输入法中的应用[J]. 软件导刊. 2010(06)
[34] 张玉华,杨季文,周克兰. 汉字编码输入法动态评测系统的设计和实现
[J]. 计算机工程与应用. 2006(25)
[35] Jianfeng Gao,Mingjing Li,Kai-Fu Lee.N-gram Distribution based Language
Model Adaptation. 2000
[36] Zhao jun.Lexicon Optimization for Chinese Language Modeling. 2000
[37] Scott MacKenzie.Mobile Text Entry Using Three Keys. 2002
[38] 赵雷,吕强,杨季文,朱巧明. 汉字输入法类的设计与实现[J]. 中文信息学
报. 1996(04)
[39] Chen Qinwu,Qiu Shuye.Study on new technology of Chinese character input.
ICCC2001( International Conference on Chinese Computing) Conference
Proceedings. 2001
[40] James C L, Reischel K M. Text input for mobile devices: comparing model
prediction to actual performance[C]//Proceedings of the SIGCHI conference on
Human factors in computing systems. ACM, 2001: 365-371.
[41] 陈计喜,姜丽红. 自动化功能测试的方法与实现[J]. 计算机工程, 2004, 30
(12):168-169.
[42] 单锦辉,姜瑛,孙萍. 软件测试研究进展[J]. 北京大学学报 (自然科学版),
2005,41(1):134-145.
[43] 徐中伟,吴芳美. 软件测试质量的度量[J]. 计算机工程与应用,2002,38
(21):100-102.

- 73 -
哈尔滨工业大学工程硕士学位论文

哈尔滨工业大学学位论文原创性声明和使用权限

学位论文原创性声明

本人郑重声明:此处所提交的学位论文《基于文本服务框架的拼音输入法
客户端设计与实现》,是本人在导师指导下,在哈尔滨工业大学攻读学位期间独
立进行研究工作所取得的成果,且学位论文中除已标注引用文献的部分外不包
含他人完成或已发表的研究成果。对本学位论文的研究工作做出重要贡献的个
人和集体,均已在文中以明确方式注明。

作者签名: 日期: 年 月 日

学位论文使用权限

学位论文是研究生在哈尔滨工业大学攻读学位期间完成的成果,知识产权
归属哈尔滨工业大学。学位论文的使用权限如下:
(1)学校可以采用影印、缩印或其他复制手段保存研究生上交的学位论文,
并向国家图书馆报送学位论文;(2)学校可以将学位论文部分或全部内容编入
有关数据库进行检索和提供相应阅览服务;(3)研究生毕业后发表与此学位论
文研究成果相关的学术论文和其他成果时,应征得导师同意,且第一署名单位
为哈尔滨工业大学。
保密论文在保密期内遵守有关保密规定,解密后适用于此使用权限规定。
本人知悉学位论文的使用权限,并将遵守有关规定。

作者签名: 日期: 年 月 日

导师签名: 日期: 年 月 日

- 74 -
哈尔滨工业大学工程硕士学位论文

致 谢

两年的研究生生活即将结束,在论文即将完成之际,向曾经支持理解和帮
助过我的人们表示衷心的感谢。
首先感谢我的论文指导老师秦兵教授,她严谨的治学态度、渊博的知识以
及对待工作兢兢业业、一丝不苟的精神都使我受益终生。秦老师在整个论文工
作过程中,对我细心指导,感谢她在论文撰写过程中提出的宝贵意见。
感谢我的父母,他们一直支持我,一如既往的鼓励我,关心我,关注着我
的每一次成长和进步。
感谢我的实习单位,腾讯科技(北京)有限公司,实习阶段不仅在技术上
学到了很多。感谢我的校外导师宋闻博,他工作积极、热情,在技术和工作方
法上给我的指导使我受益匪浅,既是工作上的伙伴,又是生活上的朋友。感谢
一起在腾讯实习的同学们,你们的陪伴使十个月的实习生活变得丰富多彩。
感谢哈尔滨工业大学对我本科以及硕士阶段的培养,感谢工大的老师、同
学和室友们,他们让我在工大的生活更加充实,视野开阔,给予了我更多的成
长的机会。

- 75 -
哈尔滨工业大学工程硕士学位论文

个人简历

1988 年 03 月 09 日出生于吉林省九台市。
2007 年 08 月考入哈尔滨工业大学软件院软件工程专业。
2010 年 8 月至 2011 年 6 月在北京神舟航天软件技术有限公司嵌入式产品
部实习。
2011 年 07 月本科毕业并获得工学学士学位。
2012 年 9 月在哈尔滨工业大学软件学院攻读软件工程硕士至今。
2012 年 7 月至 2013 年 5 月在腾讯科技(北京)有限公司输入法组实习。

- 76 -

You might also like