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

### Delphi 中 TSF (文本服务框架) 与输入法的实现 #### 文本服务框架简介 文本服务框架(Text Services Framework, TSF)是一个由微软设计的架构,旨在支持复杂的文本处理需求。TSF 提供了一种统一的方法来管理多种语言环境下的文本输入和编辑操作[^1]。 #### 主要组件介绍 为了在 Delphi 应用程序中集成并利用 TSF 进行输入法开发,开发者需要熟悉以下几个核心概念: - **ITfSource 接口**: 此接口允许应用程序接收来自 TSF 的通知事件。 - **ITfDocumentMgr 接口**: 负责管理和维护文档范围内的上下文对象集合。 - **ITfContext 接口**: 表示特定于某个线程或进程的应用程序内部状态。 - **ITfThreadMgr 接口**: 控制整个线程级别的文本服务行为。 这些接口共同作用以确保输入过程能够平滑运行,并且可以与其他 Windows 组件无缝协作。 #### 数据结构说明 当涉及到具体编码时,还需要注意一些重要的数据结构,它们对于构建高效的 IME 至关重要: - `CANDIDATEFORM` 和 `CANDIDATELIST`: 描述候选词的选择界面及其布局方式。 - `COMPOSITIONFORM`: 定义了组合框的位置以及外观属性。 - `IMECHARPOSITION`: 记录当前正在编辑的文字所在屏幕坐标。 - `RECONVERTSTRING`: 支持重新转换已提交的内容以便纠正错误输入。 - `REGISTERWORD`: 添加新词条到用户的个人字典里去[^2]. #### 编码实践指南 下面给出一段简单的代码片段作为例子展示如何初始化一个基本的支持 TSF 功能的应用窗口,在此之后可以根据实际项目的需求进一步扩展功能集。 ```delphi uses ComObj; procedure TForm1.FormCreate(Sender: TObject); var ThreadManager: IUnknown; begin OleInitialize(nil); // 初始化 COM 环境 CoCreateInstance(CLSID_TF_ThreadMgr, nil, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, ThreadManager); // 将 ITfThreadMgr 接口指针赋给全局变量 g_pThreadMgr 使用... end; ``` 这段代码展示了创建一个新的线程管理者实例的过程,这是启动任何基于 TSF 的应用所必需的第一步。通过这种方式,可以在后续的操作中获取更多关于文本输入的状态信息和服务支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值