为自定义墨迹收集器启用文本更正

Microsoft Tablet PC 输入面板是一种功能强大的工具,可用于使用笔输入手写文本并更正文本,而无需使用键盘。 使用输入面板时,用户通过在输入面板的墨迹图面上手写来输入文本,这会导致输入面板将用户的手写识别为文本。 识别文本后,用户点击“输入面板”上的“插入”,将文本插入应用程序或文档。 在插入文本之前,用户有权访问输入面板中的一组更正工具。 这些操作包括选择替代识别结果、重写单个字符的能力,甚至能够擦除整个单词并重写。 这些更正工具使用户能够纠正识别错误和人为错误。

使用输入面板输入的文本在文档中后,用户可以访问在基于 Windows 文本服务框架和已启用文本服务的应用程序中插入之前提供的相同更正功能。 从 Microsoft Windows XP Service Pack 2 平板电脑版开始,默认情况下,所有 Rich Edit 应用程序都启用文本服务;从 Windows Vista 开始,HTML 应用程序默认启用文本服务。 文档内更正仅适用于基于文本服务且已启用的应用程序;这是因为输入面板依赖于文本服务存储关联的文本属性(包括墨迹对象和识别替代项)的功能,以提供文档内更正。

带文本更正的平板电脑输入面板

但是,有许多方案(包括更正语音识别或随时随地更正键入的文本)不会从使用输入面板的文本输入开始,但在其中,文档内更正对平板电脑用户非常有用。 主要示例是提供自定义墨迹书写表面以使用笔输入文本的应用程序。 自定义墨迹图面是应用程序提供特定于每个应用程序文本输入任务的独特定制功能的绝佳方式。 此外,自定义墨迹书写表面提供完全集成的平板电脑用户体验,这清楚地表明触控笔是包含它们的应用程序中的一类输入设备。 但是,提供自定义墨迹表面的应用程序可能不允许或可能无法提供与输入面板文档内更正相同的更正支持级别。

自定义墨迹收集器

基于文本服务的或已启用的应用程序(其中文档内更正对未使用输入面板输入的文本的更正非常有用)能够使用输入面板的 IHandWrittenTextInsertion API (托管代码) 中的 Microsoft.TextInput.HandwrittenTextInsertion 类,以便对通过其他方式输入的文本启用文档内更正。 通过这种方式,应用程序可以廉价地为其自定义墨迹书写表面或其他文本输入方案添加强大的更正支持,并完善其平板电脑文本输入故事。 输入面板 IHandWrittenTextInsertion API 作为 Windows Vista 操作系统的一部分包含在平板电脑平台 SDK 1.9 或更高版本中。 同时包含基于 .NET 和 COM 的 API 版本。 Windows Vista 及更新版本支持对未使用输入面板输入的文本启用文档内更正。 文档内更正仅适用于拉丁语,并且无法显示拉丁字符集之外的任何字符。

如何在应用程序中使用 HandwrittenTextInsertion API

对于未使用输入面板和 IHandWrittenTextInsertion API 输入的文本,集成输入面板文档内更正,对应用程序进行所需的更改非常简单。 应用程序的所有自定义文本输入代码都保持不变,最后一步除外。 在启用文本服务的文本字段中显示使用自定义墨迹图面、语音识别或其他方式输入的文本时,应用程序会将文本发送到 IHandWrittenTextInsertion 接口,而不是直接将其发送到文本字段。 然后,输入面板可编程性组件处理将文本插入文本字段和文本服务后备存储。 将文本添加到文本服务后备存储时,输入面板可编程性组件负责设置输入面板为该文本启用文档内更正所需的文本属性。

以下部分详细介绍了使用 IHandWrittenTextInsertion API 的 COM 版本的 C++ 应用程序的过程。 在 C# 中使用 .NET FRAMEWORK 版本的 API 的步骤与在 C++ 中使用 COM 版本不同的地方都有说明。 托管 HandwrittenTextInsertion API 包括单个 COM 接口 IHandwrittenTextInsertion。 此接口的定义位于 PenInputPanel.h 和 PenInputPanel_i.c 中。

首先,应用程序应使用 CoCreateInstance 函数生成类 id 为 CLSID_HandwrittenTextInsertionIHandWrittenTextInsertion 实例。 请注意,只有在创建窗口并指定焦点后, CLSID_HandwrittenTextInsertion 对象的创建才会成功,因为在此之前,文本服务后备存储不会激活。 此外,如果系统上不存在tiptsf.dll, CoCreateInstance 函数将失败并返回 REGDB_E_CLASSNOTREG,表示系统不支持输入面板文档内更正。 此时,应用程序应在不尝试启用输入面板文档内更正的情况下继续。 HandwrittenTextInsertion 的实例必须可从处理文本字段中插入文本的应用程序代码访问。

注意

使用 .NET Framework 版本的 API 时,应用程序应添加 using 语句以允许访问 Microsoft.Ink.TextInput 命名空间,然后直接创建对象。

 

其次,必须更改应用程序负责在文本字段中插入文本的代码,以便它不再直接将文本插入文本字段,而是调用 IHandwrittenTextInsertion 的两种插入方法中的一种或另一种。 应用程序应选择调用 InsertRecognitionResultsArray 还是 InsertRecognitionResults 取决于应用程序是否具有作为数组或 IInkRecognitionResult 对象存储的文本的替代识别。

注意

在托管代码中工作时,InsertRecognitionResultsArray 使用的相应识别对象为 RecognitionResult。 这两种方法都使用以下三个参数:

 

  • 候补 字符串的二维集合,存储为数组数组或 IInkRecognitionResult (或 RecognitionResult) 对象。 如果备用项存储为数组数组,则应将其作为安全数组指针传递。 顶级数组中的每个条目都是插入中单个单词的替换项列表。 替换项的子数组中位置零处的条目是插入到文本字段中的文本。 每个子数组) (索引 1 到 n 的其他备用索引存储在文本服务后备存储中,并作为文档内更正的一部分提供给用户。 如果未包含替代项,则用户会看到“无建议”代替替换项列表。 如果插入包含多个单词之间有空格,则必须将每个空格作为顶级数组中的一个条目包含在内。
  • 语言alternates 参数中包含的文本相对应的输入语言 LCID。 如果 备用 内容是由手写或语音识别器生成的,这也是与使用的识别器关联的 Languages 属性。
  • fLatticeContainsAutoSpacingInformation 一个标志,指示 alternates 参数中包含的文本是否由启用了自动间距的识别器生成。 如果启用了自动间距,则应将标志设置为 TRUE。 如果禁用了自动间距,则应将标志设置为 FALSE。 如果 替换 内容是由不支持自动间距的识别器生成的,或者根本不由识别器生成,则应将标志设置为 FALSE

输入面板的可编程性模型能够从系统插入符号的位置在文档或应用程序中插入文本。

如果插入成功,这两种方法都会返回 S_OK 。 如果应用程序不基于文本服务或未启用文本服务,则返回E_NOINTERFACE,如果备用项的格式不正确或无法访问,则返回E_INVALIDARG。 如果系统上没有足够的可用内存,或者在发生灾难性故障(例如未启用文本服务框架)后E_FAIL,它们也可能返回E_OUTOFMEMORY

结论

对于基于文本服务或已启用文本服务的应用程序来说,为未使用输入面板输入的文本启用输入面板文档内更正是一种廉价且简单的方法,可以补充自定义墨迹书写法或输入法,具有强大的基于笔的更正功能。 在 Windows Vista 上,所有 Rich Edit 和 Trident 应用程序都已启用文本服务。 虽然集成墨迹书写表面是向应用程序添加自定义平板电脑用户体验的绝佳选择,但如果它们不包含更正功能,则它们仅支持一半的文本输入。 文档内更正通过添加将所选内容交换为识别备用选项或重写部分或全部选定内容的功能,为用户提供了故事的另一半。

对文本输入面板进行编程