最近一直在做一个拼音输入法的项目,需要使用微软的文本服务框架(Text Service Framework,简称TSF),第一次使用TSF,记录其中的一些知识点。
TSF技术
TSF工作原理
TSF是一个与输入设备无关、与输入语言无关的可扩展系统,可以向文本输入和语言处理提供相关服务。TSF以一组COM接口的方式向应用程序和文本服务公开其框架。
TSF基本体系结构如下图(图源网络)所示:
一般应用程序会包括显示、直接编辑、文本存储几个主要功能,通过实现一个COM服务来提供文本访问能力。
文本服务的功能是向应用程序提供文本,文本服务也是以COM来实现的,系统中允许同时注册多个文本服务。(像通常见到的拼音输入、语音输入、手写输入,就是几种不同的文本服务)
TSF管理器的功能由操作系统实现,不能被任何形式的应用程序代替。允许一个应用程序和一个或多个文本服务共享文本内容。
TSF主要概念
概念主要参考网上的一些资料,感觉有些不是很确切的明白,,,
文本存储
文本存储是由应用程序提供来源,通过TSF管理器实现的一种在应用程序和文本服务之间共享文本流的机制,将文档看作是包含Unicode字符和控制代码的文本流,使用字符的应用程序字符位置(ACP)来定位和操作文本流。
片段
应该就是指ITfRange,所有文本都存储在被称为
片段
的对象中,片段是描述文本流中的某一小段文本的对象,不与文本流上的字符位置相关联,与特定的文本段相关联。所以这段文本在文本流中位置变化时也不用重新定义片段,也就是说,片段是可游移的。range由两个锚点来界定,一个
start anchors
,一个end anchors
。属性
ITfProperty,属性用来关联文本片段和元数据。
获取特定属性时,使用ITfContext::GetProperty方法,调用该方法时,必须指定一个特定的属性类型。
公共缓冲池
客户端程序之间通过公共缓冲池来实现数据共享,为数据共享提供一个数据存储和消息处理的机制。缓冲池通过GUID标识,客户端通过发布GUID来实现公共缓冲池的共享,只有注册为TSF客户端的程序才能修改公共缓冲池的数据。
文档锁
文档锁的作用是允许TSF管理器对文本内容进行互斥访问。
TSF主要接口
线程管理器(ITfThreadMgr)
完成有关应用程序和文本服务(客户端)之间进行联系的公共任务,包括激活或挂起TSF文本服务、文档管理器的创建、维护文档和输入焦点之间的正确关联等各种任务。
客户端标识符(ITfClientId)
应用程序和文本服务被定义为客户端,需要维护一个客户端标识符。
编辑内容(ITfContext)
基本的文本输入模型,可以理解为一个通过ITfContext接口创建的连续的文本流。
文档管理器(ITfDocumentMgr)
通过ITfDocumentMgr接口创建并用来管理编辑内容的。
输入组合(ITfComposition)
输入组合是一个临时输入状态,应用程序需要获取ITfComposition的显示属性信息,通过判断输入组合是否存在,来将其状态显示给用户。
编辑会话(ITfEditSession)
编辑会话由文本服务实现,并由TSF管理器调用来读取或修改文本和属性的上下文。
其他一些点
- 获取某个文本片段所有者的CLSID(类标识符)时,应该先用ITfContext::GetProperty方法获取属性对象,然后用ITfProperty::FindRange方法得到覆盖该属性的文本片段,最后用ITfReadOnlyProperty::GetValue方法得到一个TfGuidAtom类型数据,表示拥有这个片段的文本服务的CLSID。
- 通过ITfContext::EnumProperties方法返回的IEnumTfProperties接口,可以列举出所有的属性对象。