拼音输入法实现&文本服务框架TSF相关知识点记录

最近一直在做一个拼音输入法的项目,需要使用微软的文本服务框架(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接口,可以列举出所有的属性对象。
-------------本文结束感谢您的阅读-------------
0%