共用方式為


啟用自定義筆跡收集器的文字更正

Microsoft平板電腦輸入面板是一個功能強大的工具,可讓您使用手寫筆輸入手寫文字,並在不使用鍵盤的情況下更正文字。 使用輸入面板時,使用者輸入文字的方式是將手寫到輸入面板的筆跡介面上,這會導致輸入面板將使用者的手寫辨識為文字。 辨識文字之後,用戶點選 [輸入面板上的插入],將文字插入應用程式或檔中。 在插入文字之前,用戶可存取輸入面板中的一組更正工具。 這些包括選擇其他辨識結果、重寫單一字元的能力,甚至可以將整個單字劃掉並重寫。 這些更正工具可讓用戶同時更正辨識錯誤和人為錯誤。

使用輸入面板輸入的文字在檔中之後,使用者可以存取在 Windows Text Services Framework 中插入之前可用的相同更正功能,型和啟用文字服務的應用程式。 從 Microsoft Windows XP Service Pack 2 平板電腦版本開始,所有 Rich Edit 應用程式預設都會啟用文字服務,從 Windows Vista 開始,HTML 應用程式預設會啟用文字服務。 檔內修正僅適用於以文字服務為基礎的和已啟用的應用程式;這是因為輸入面板取決於文字服務儲存相關文字屬性的功能,包括筆跡對象和辨識替代專案,以提供檔內更正。

平板電腦輸入面板與文字更正

不過,有許多案例,包括更正語音辨識或隨時更正鍵入的文字,這些情況不是使用輸入面板從文字輸入開始,但檔內更正對於平板電腦用戶來說非常有用。 主要範例是在應用程式中,提供自定義筆跡介面,以使用手寫筆輸入文字。 自定義筆跡介面是應用程式提供每個應用程式文字輸入工作特有的獨特量身打造功能的絕佳方式。 此外,自訂筆跡表面提供了完全整合的平板電腦用戶體驗,這明顯地指出手寫筆在包含這些表面的應用程式中是頂級的輸入設備。 不過,提供自定義手寫介面的應用程式可能不會允許或無法提供像輸入面板的文件內更正那樣相同層級的更正支援。

自定義筆跡收集器

基於或啟用文字服務的應用程式,若需要在文件內更正非通過輸入面板輸入的文字,可使用輸入面板的 IHandWrittenTextInsertion API(在 Managed 程式碼中使用Microsoft.TextInput.HandwrittenTextInsertion 類別)來啟用以其他方式輸入之文字的檔內更正。 如此一來,應用程式就可以廉價地為其自定義筆跡表面或其他文字輸入場合增加強大的校正支援,並完善其平板電腦文字輸入功能。 輸入面板 IHandWrittenTextInsertion API 隨附於 Windows Vista 作業系統中,以及作為 Tablet PC 平台 SDK 1.9 版或更新版本的一部分。 包含以 .NET 和 COM 為基礎的 API 版本。 Windows Vista 和更新版本支援針對未使用輸入面板輸入的文字啟用檔內更正。 檔內修正僅適用於拉丁語言,而且無法在拉丁字元集外顯示任何字元。

如何在應用程式中使用 HandwrittenTextInsertion API

應用程式所需的變更非常簡單,以整合輸入面板檔內更正,用於未使用輸入面板輸入的文字。此外,使用 IHandWrittenTextInsertion API。 除了最後一步之外,應用程式的所有自訂文字輸入代碼都維持不變。 在使用自定義筆跡介面、語音辨識或其他方式輸入的文字要顯示在啟用文字服務的文字欄位中時,應用程式會將文字傳送至 IHandWrittenTextInsertion 介面,而不是將文字直接傳送至文字字段。 輸入面板可程式化元件接著會處理將文字插入文字欄位和 Text Services 的後援存儲。 當將文字新增至文字服務的後備儲存區時,輸入面板的可程式化元件負責設定該文字的屬性,以啟用輸入面板的文件內更正功能。

以下章節將詳細介紹使用 COM 版本的 IHandWrittenTextInsertion API 的 C++ 應用程式的過程。 在任何地方註明 C# 中使用 .NET Framework 版本的 API 的步驟與在 C++ 中使用 COM 版本的步驟有何不同。 Managed HandwrittenTextInsertion API 包含一個 COM 介面,IHandwrittenTextInsertion。 此介面的定義位於 PenInputPanel.h 和 PenInputPanel_i.c。

首先,應用程式應該使用 CoCreateInstance 函式來產生類別標識碼為 CLSID_HandwrittenTextInsertion的 IHandWrittenTextInsertion 實例。 請注意,只有在建立視窗並指定焦點之後,才會成功建立 CLSID_HandwrittenTextInsertion 對象,因為在此之前,不會啟動文字服務備份存放區。 此外,如果系統上沒有 tiptsf.dll,CoCreateInstance 函式會失敗並傳回 REGDB_E_CLASSNOTREG,表示系統上不支援輸入面板檔內更正。 此時,應用程式應該繼續,而不嘗試啟用輸入面板的檔內更正。 HandwrittenTextInsertion 的實例,必須可從處理插入文字到文字欄位的應用程式程式代碼存取。

注意

使用 API 的 .NET Framework 版本時,應用程式應該新增 using 語句,以允許存取 Microsoft.Ink.TextInput 命名空間,然後直接建立物件。

 

其次,必須改變負責將文字插入文字欄位的應用程式程序代碼,使其不再直接將文字插入文字欄位中,而是改為呼叫 IHandwrittenTextInsertion的兩個插入方法的其中一個或另一個。 應用程式是否應選擇呼叫 InsertRecognitionResultsArrayInsertRecognitionResults 取決於應用程式的文字辨識替代項目是儲存為陣列還是作為 IInkRecognitionResult 物件。

注意

在受管理的程式碼中工作時,InsertRecognitionResultsArray 取用的對應辨識物件是 RecognitionResult。 這兩種方法都會取用下列三個參數:

 

  • 替代 這是字串的二維集合,儲存為陣列陣列或 IInkRecognitionResult (或 RecognitionResult) 物件。 如果替代專案儲存為陣列陣列,則應該以安全陣列指標的形式傳遞。 最上層陣列中的每個條目都是單個單字插入的替代選項清單。 替代選項子陣列中位置為零的項目是插入到文本欄位的內容。 其他替代選項(每個子陣列中的索引 1 到 n)會儲存在文字服務備份存儲中,並作為文件內校正的一部分提供給使用者做為選擇。 如果未包含替代專案,則使用者會看到「沒有建議」取代替代項目清單。 如果插入包含多個單字,且單字之間有空格,那麼每個空格必須作為最上層陣列中的一個元素。
  • 語言 輸入語言 LCID 對應於 替代 參數中包含的文字。 在某種情況下,如果 的替代內容 是由手寫或語音辨識器產生的,這同時也是與所使用辨識器相聯的 Languages 屬性。
  • fLatticeContainsAutoSpacingInformation 一個指示標誌,用於指出 替代項 參數中包含的文字是否由啟用自動間距功能的辨識器產生。 如果已啟用自動間距,則旗標應該設定為 TRUE。 如果停用自動間距,則旗標應該設定為 FALSE。 如果 替代內容是由不支援自動空格的辨識器所產生,或完全不是由任何辨識器產生,則標誌應該設定為 FALSE

輸入面板的可程式性模型能夠從系統插入號的位置,在檔案或應用程式中插入文字。

如果插入成功,這兩種方法都會傳回 S_OK。 如果應用程式不是基於或啟用了文字服務,會傳回 E_NOINTERFACE,如果 替代選項 格式不正確或無法存取,會傳回 E_INVALIDARG。 在系統上若沒有足夠的記憶體,它們可能傳回 E_OUTOFMEMORY;而在未啟用文字服務架構等重大失敗後,可能傳回 E_FAIL

結論

針對未使用輸入面板輸入的文字啟用在文件中校正功能,對於以文字服務為基礎或已啟用的應用程式來說,是以強大的手寫筆基礎校正功能來補充自定義筆跡或輸入法的一種便宜且簡單的方法。 在 Windows Vista 上,所有 Rich Edit 和 Trident 應用程式都會啟用文字服務。 雖然整合式筆跡介面是將自定義平板電腦用戶體驗新增至應用程式的絕佳選項,但如果不包含更正功能,則僅支援一半的文字輸入。 檔內更正可藉由新增將選取範圍交換為辨識替代專案,或重寫部分或所有選取範圍的功能,為使用者提供本文的另外一半。

文字輸入面板程序設計