啟用自訂筆跡收集器的文字更正
Microsoft 平板電腦輸入面板是一種功能強大的工具,可用於使用手寫筆輸入手寫文字,以及更正文字,而不需要使用鍵盤。 使用輸入面板時,使用者在輸入面板的手寫筆跡介面上輸入文字,這會導致輸入面板將使用者的手寫辨識為文字。 辨識文字之後,使用者點選 [輸入面板上的插入],將文字插入應用程式或檔中。 在插入文字之前,使用者可以存取輸入面板中的一組更正工具。 這些包括選取替代辨識結果、重寫單一字元的能力,或甚至重新撰寫整個單字和重寫的能力。 這些更正工具可讓使用者同時更正辨識錯誤和人為錯誤。
使用輸入面板輸入的文字在檔中之後,使用者即可存取在 Windows Text Services 架構型和啟用文字服務的應用程式中插入之前可用的相同更正功能。 從 Microsoft Windows XP Service Pack 2 平板電腦版本開始,所有 Rich Edit 應用程式預設都會啟用文字服務,從 Windows Vista 開始,HTML 應用程式預設會啟用文字服務。 檔內更正僅適用于文字服務型和已啟用的應用程式;這是因為輸入面板相依于文字服務儲存相關文字屬性的功能,包括筆跡物件和辨識替代專案,以提供檔內更正。
不過,有許多案例,包括更正語音辨識或更正 Go 上的輸入文字,這些情況不會使用輸入面板從文字輸入開始,但對於平板電腦使用者而言,檔內更正非常有用。 主要範例是在應用程式中,提供自訂筆跡介面,以使用手寫筆輸入文字。 自訂手寫筆跡介面是應用程式提供每個應用程式文字輸入工作特有的獨特量身打造功能的絕佳方式。 此外,自訂手寫筆跡介面提供完全整合的平板電腦使用者體驗,這可讓畫筆清楚成為包含這些裝置的應用程式中的第一級輸入裝置。 不過,提供自訂手寫筆跡介面的應用程式可能不允許或無法提供可從輸入面板檔內更正取得的相同等級更正支援。
文字服務型或啟用的應用程式,其中檔內更正對於未使用輸入面板輸入的文字的更正很有用,可以使用輸入面板的 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# 中使用 API .NET Framework 版本的步驟與 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的實例必須可從處理將文字插入文字欄位的應用程式程式碼存取。
注意
使用.NET Framework版本的 API 時,應用程式應該新增 using 語句,以允許存取Microsoft.Ink.TextInput命名空間,然後直接建立物件。
其次,必須改變負責將文字插入文字欄位的應用程式程式碼,使其不再直接將文字插入文字欄位,而是改為呼叫 IHandwrittenTextInsertion的兩個插入方法。 應用程式是否應該選擇呼叫 InsertRecognitionResultsArray 或 InsertRecognitionResults ,取決於應用程式是否具有儲存為數組或 IInkRecognitionResult 物件的文字辨識替代專案。
注意
在 Managed 程式碼中工作時,InsertRecognitionResultsArray 所取用的對應辨識物件是 RecognitionResult。 這兩種方法都會取用下列三個參數:
- 候補 這是字串的二維集合,儲存為數組陣列或 IInkRecognitionResult (或 RecognitionResult) 物件。 如果替代專案儲存為數組陣列,則它應該以安全陣列指標的形式傳遞。 最上層陣列中的每個專案都是插入中單字的替代專案清單。 替代子陣列中位置為零的專案是插入文字欄位的文字。 每個子陣列中其他 (索引 1 到 n) 都會儲存在文字服務支援存放區中,並提供給使用者做為檔內更正的選項。 如果未包含替代專案,則使用者會看到「沒有建議」取代替代專案清單。 如果插入包含具有空格的多個單字,則每個空格都必須包含在最上層陣列中的專案。
- 語言對應至替代參數中所含文字的輸入語言LCID。 在手寫或語音辨識器產生 替代 專案的內容的情況下,這也是與所使用辨識器相關聯的 Languages 屬性。
- fLatticeContainsAutoSpacingInformation 旗標,指出 替代 參數中包含的文字是否由啟用自動間距的辨識器所產生。 如果已啟用自動間距,則旗標應設定為 TRUE。 如果停用自動間距,則旗標應設定為 FALSE。 如果 替代 專案的內容是由不支援自動間距的辨識器所產生,或完全不是由辨識器產生,則旗標應該設定為 FALSE。
輸入面板的程式設計模型可以從系統插入號的位置,在檔或應用程式中插入文字。
如果插入成功,這兩種方法都會傳回 S_OK 。 如果應用程式不是以文字服務為基礎或啟用,則會傳回E_NOINTERFACE;如果替代專案格式不正確或無法存取,則傳回E_INVALIDARG。 如果系統上沒有足夠的記憶體可用,或是在未啟用文字服務架構等重大失敗之後E_FAIL,它們也可能傳回E_OUTOFMEMORY。
結論
使用輸入面板啟用未使用輸入面板輸入之文字的檔內更正,是文字服務型或啟用應用程式以強大的手寫筆型更正功能補充自訂筆跡或輸入法的簡單方式。 在 Windows Vista 上,所有 Rich Edit 和 Trident 應用程式都會啟用文字服務。 雖然整合式手寫筆跡表面是將自訂平板電腦使用者體驗新增至應用程式的絕佳選項,但如果不包含更正功能,則僅支援一半的文字輸入。 檔內更正可藉由新增對辨識替代專案交換選取範圍的功能,或重寫部分或全部選取專案,為使用者提供本文的另一半。
相關主題