共用方式為


使用輸入面板自動完成

在 Windows Vista 中,平板電腦輸入面板會整合新的自動完成功能,讓應用程式的自動完成清單在輸入面板中辨識使用者筆跡時即時更新。 此外,應用程式的自動完成清單位於輸入面板使用者的便利位置。 如果沒有輸入面板自動完成,搭配輸入面板使用自動完成功能是一個困難的程式,需要使用者一次插入一個字元,並移動輸入面板才能存取自動完成建議。 透過整合,自動完成是平板電腦使用者的強大工具,可加速並增加使用輸入面板輸入文字的便利性。

具有 ie 自動完成清單的輸入面板

應用程式如何利用輸入面板自動完成整合的方式有三個選項。 包含使用殼層自動完成 (透過IAutoComplete介面) 或透過AutoCompleteMode列舉.NET Framework自動完成 (的應用程式,) 接收輸入面板自動完成整合,而不需要變更程式碼。 包含自訂自動完成文字欄位的應用程式可以使用輸入面板自動完成 API 來取得相同的功能。

在所有情況下,您可以對應用程式的自動完成清單進行這些修改,而不需複製或修改應用程式用來產生自動完成清單的 UI 或預測邏輯。 自動完成清單會繼續由應用程式繪製,而自動完成清單的內容與文字直接輸入編輯欄位相同。

Windows Vista 作業系統或更新版本支援輸入面板自動完成整合。 輸入面板自動完成整合內建于從 Windows Vista 開始的 Shell 自動完成,以及從 .NET Framework 3.0 版開始Windows Forms開發。 雖然 IAutoCompleteAutoCompleteMode 都會在舊版 Windows 上執行,但 Microsoft Windows XP 平板電腦版或舊版作業系統不支援輸入面板自動完成整合。 如果您在舊版平板電腦上執行輸入面板自動完成,應用程式會還原為預先整合行為。

整合應用程式自動完成清單與輸入面板的原因

應用程式自動完成清單的整合可讓使用者在包含自動完成功能的文字欄位中輸入文字時,能夠最輕鬆且快速的輸入。 此外,包含輸入面板自動完成整合的應用程式會立即顯示為以平板電腦開發,讓應用程式更吸引平板電腦使用者。

輸入面板和自動完成清單如何在不整合的情況下互動

使用輸入面板在包含自動完成清單但未與輸入面板整合的文字欄位中輸入文字:

  1. 使用者會將焦點放在文字欄位中,然後開啟 [輸入面板]。
  2. 使用者寫入一或兩個字元。
  3. 使用者點選 [插入]。 輸入面板會將文字輸入應用程式文字欄位。 應用程式的 [自動完成] 清單隨即出現,而且很可能由輸入面板部分或完全遮蔽。
  4. 使用者拖曳 [輸入面板] 以找出應用程式的 [自動完成] 清單。
  5. 假設自動完成清單中包含正確的專案,使用者現在可以選取該專案;否則,使用者必須重複步驟 2 和 3。

這顯然是一個麻煩的程式。 使用者對於自動完成清單應該如何運作的預期是虛線的,而且其執行工作的能力會受到影響。

輸入面板和自動完成清單互動如何改善與整合

使用輸入面板將文字輸入文字到包含與輸入面板整合的自動完成清單的文字欄位中:

  1. 使用者會將焦點放在文字欄位中,然後開啟 [輸入面板]。
  2. 使用者寫入一或兩個字元。 當使用者寫入文字時,應用程式的自動完成清單會出現在輸入面板上方或正下方。
  3. 使用者從 [自動完成] 清單中選取專案;專案會直接插入應用程式的文字欄位中,或使用者重複步驟 2,直到出現正確的專案為止。

由於整合,當使用者在輸入面板中撰寫時,自動完成清單隨即出現並更新。 此外,清單會定位,讓使用者在寫入時存取,且不會被輸入面板遮蔽。 最後,當使用者從自動完成清單中選取專案時,專案會直接插入應用程式的文字輸入欄位中,讓使用者略過從輸入面板插入文字的步驟。

具有 outlook express 自動完成清單的輸入面板

包含輸入面板自動完成整合的標準自動完成元件

IAutoCompleteAutoCompleteMode都包含輸入面板自動完成的內建整合。 使用這些標準自動完成元件之一的應用程式可以利用輸入面板自動完成功能,幾乎不需要額外的工作。 此外,雖然只有在 Windows Vista 或新版本的 Windows 作業系統上才支援輸入面板自動完成,但 Windows Vista 發行前使用 IAutoComplete 建置的應用程式會自動取得 Windows Vista 上執行的輸入面板自動完成整合。 下列各節包含包含輸入面板自動完成整合之特定 IAutoComplete 和 AutoCompleteMode 元素的詳細資訊。

使用輸入面板自動完成整合的殼層自動完成

使用 IAutoComplete 的應用程式免費取得輸入面板自動完成整合。 雖然 Shell 自動完成 API 包含在 Windows 2000 之後,但輸入面板自動完成整合僅支援 Windows Vista 和更新版本。 不過,在使用 IAutoComplete 的 Windows Vista 版本之前建置的應用程式會在 Windows Vista 上執行時自動取得輸入面板自動完成整合。

若要以這種方式利用平板電腦自動完成,您必須使用自動完成物件 (CLSID_Autocomplete) 。 如果您想要提供 URL 或檔案名的自動完成功能,請使用 SHAutoComplete 函式來建立自動完成物件。

除了 IAutoComplete之外,您還可以直接實作 IAutoComplete2IAutoCompleteDropDowns,而且仍會自動取得輸入面板自動完成整合。

輸入面板自動完成與 .NET Framework 應用程式的整合

從 .NET Framework 3.0 開始,Windows Forms文字方塊包含自動完成。 Windows Forms文字方塊自動完成建置在殼層自動完成之上,這表示輸入面板自動完成整合也會內建。 在 Windows Vista 之前發行的 Windows 版本上,.NET Framework 3.0 支援下層。 不過,因為只有 Windows Vista 或更新版本才支援輸入面板自動完成整合,所以輸入面板自動完成整合只能在 Windows Vista 或更新版本上安裝的 .NET Framework 3.0 應用程式中運作。

想要利用 .NET Framework 3.0 中輸入面板自動完成整合的應用程式必須使用已啟用AutoCompleteMode屬性的 Windows Forms TextBox。 除了Windows Forms自動完成之外,您不需要執行任何其他工作,才能利用輸入面板自動完成整合。

直接使用輸入面板自動完成 API

自訂自動完成文字方塊的開發人員必須直接使用輸入面板自動完成 API,才能取得輸入面板自動完成整合在其應用程式中啟用的改良文字輸入體驗。 輸入面板自動完成 API 包含在 Windows Vista 作業系統中,以及平板電腦平臺 SDK 1.9 版或更新版本的一部分。 輸入面板自動完成介面是以 COM 為基礎的介面。

下一節將詳細說明 C++ 應用程式使用這些介面。 不過,這些 COM 介面可以透過使用 COM Interop,以大部分的語言實作,包括 C# 。

為了在自訂自動完成文字方塊中實作輸入面板自動完成整合,這兩個必要的介面是 ITipAutocompleteProvider 介面ITipAutocompleteClient 介面。 這些介面的定義可在 TipAutoComplete.h 和 TipAutoComplete_i.c 中找到。

首先,應用程式必須定義並具現化自動完成提供者類別,此類別會針對包含自動完成清單的每個文字專案欄位實作 ITipAutocompleteProvider 。 這個類別會管理自動完成整合的應用程式端。 所有來自輸入面板的自動完成要求都是透過應用程式的自動完成提供者從自動完成用戶端到應用程式。 應用程式的自動完成提供者必須能夠存取應用程式的自動完成清單的 HWND,以及相關聯文字專案欄位的 HWIND。 此外,必須實作 下列 ITipAutocompleteProvider 方法:

  • ITipAutocompleteProvider::UpdatePendingText 方法:Autocomplete 用戶端會使用此方法來通知使用者已寫入輸入面板的文字應用程式。 收到此通知時,提供者會負責產生自動完成清單,就像文字已輸入應用程式文字輸入欄位一樣。 字串會透過 ITipAutocompleteProvider::UpdatePendingText 方法 傳遞至自動完成提供者,只包含目前在輸入面板中的文字。 因此,如果文字輸入欄位中有額外的文字,提供者必須負責正確地將它附加至用戶端所傳送的文字。 ITipAutocompleteProvider::UpdatePendingText 方法所傳遞的字串應該視為欄位中目前選取範圍的取代專案。 如果沒有目前的選取範圍,它應該放在目前插入點的位置。 產生自動完成清單之後,提供者應該呼叫 ITipAutocompleteProvider::Show 方法 傳入 TRUE 以顯示自動完成清單。 應用程式不應該快取 對 UpdatePendingText 的呼叫,而是將 每個對 UpdatePendingText 的呼叫視為先前呼叫的取消,以避免快顯過期的自動完成清單 UI。下列範例程式碼說明這些做法。

    HRESULT SampleProvider::UpdatePendingText(BSTR bstrPendingText)
    {
       //Discard previously cached pending text from Input Panel
       m_bstrPending.Empty();
        //Store the new pending text from Input Panel as m_bstrPending
    m_bstrPending = bstrPendingText;
    
        //Get the text from the field in two chunks. The characters to
    //the left of the selection and the characters to the right.
    CComBSTR bstrLeftContext = //Text to the left of the selection
            CComBSTR bstrRightContext = //Text to the right of the selection
    
    //Discard previously cached complete text
        m_bstrCompleteText.Empty();
        //Append to the field text from the left of the selection
        //the text from Input Panel and then append to that
        //the field text to the right of the selection
        m_bstrCompleteText.Append(bstrLeftContext);
        m_bstrCompleteText.Append(m_bstrPending);
        m_bstrCompleteText.Append(bstrRigtContext);
    
        //Update the app's AC list based on m_bstrCompleteText
        //...
    
        //Show the updated AC list by calling the provider's Show method
       Show(true);
       return S_OK;
    }
    
  • ITipAutocompleteProvider::Show 方法:此方法是從 UpdatePendingText呼叫,但也可以由 Autocomplete 用戶端隨時呼叫。 收到此呼叫時,自動完成提供者必須隱藏或顯示由 參數指示的自動完成提供者。 在顯示自動完成清單之前,自動完成提供者應該會洽詢自動完成用戶端,以瞭解自動完成清單的位置。 本文稍後會出現有關定位自動完成清單的詳細資訊。

接下來,應用程式應該使用 Active Template Library (ATL) CoCreateInstance 函式來產生 ITipAutocompleteClient 介面 的實例,其類別識別碼 CLSID_TipAutoCompleteClient 為同進程伺服器,然後向用戶端註冊提供者。 Autocomplete 用戶端 ITipAutocompleteClient::AdviseProvider 方法 會向用戶端註冊提供者,讓用戶端能夠呼叫應用程式的 Autocomplete 提供者物件。 如果系統上沒有tiptsf.dll, CoCreateInstance 函式會失敗並傳回 REGDB_E_CLASSNOTREG。 此時,應用程式可以捨棄其 ITipAutocompleteProvider 物件,並繼續進行,就像輸入面板不存在一樣,因為它不在這類系統上。

應用程式可以選擇建立一個 ITipAutocompleteClient 實例,或每個文字欄位一個實例。 第一個選項要求每次變更焦點時,提供者都必須取消註冊和註冊。 本主題稍後會出現取消註冊自動完成提供者的詳細資訊。

有數個步驟涉及放置自動完成清單,必須在自動完成提供者 (應用程式) 與自動完成用戶端 (輸入面板) 之間協調。 在顯示自動完成清單之前,可能是因為呼叫自動完成提供者的 Show 方法,或是因為使用者使用鍵盤輸入文字,所以提供者必須查閱用戶端,以取得自動完成清單的位置。 提供者應採取下列步驟:

  • 使用 Autocomplete 用戶端的 ITipAutocompleteClient::RequestShowUI 方法 ,判斷輸入面板是否已準備好顯示自動完成清單。 RequestShowUI 會採用 HWND 參數,這是自動完成清單視窗的 HWND,而方法會傳回 TRUEFALSE ,以指出它是否為自動完成清單可以顯示的狀態。 如果用戶端傳回 FALSE,提供者不應該嘗試顯示自動完成清單。

  • 呼叫 RequestShowUI 以在呼叫 ITipAutocompleteClient::P referredRects 方法之前,先設定快顯自動完成清單視窗控制碼。 呼叫PreferredRects時,無法這麼做會導致E_INVALIDARG錯誤。

  • 如果 RequestShowUI 傳回 TRUE,提供者應該根據文字輸入欄位的位置計算自動完成清單的預設螢幕座標矩形,然後呼叫 Autocomplete 用戶端的 ITipAutocompleteClient::P referredRects 方法。 這可讓自動完成用戶端調整矩形,以避免自動完成清單與輸入面板重迭。 PreferredRects方法採用四個參數:

    • RECT rcACList:自動完成清單的預設螢幕座標矩形。
    • RECT rcField:對應文字輸入欄位的螢幕座標矩形。
    • RECT *中國ModifiedACList:自動完成的調整螢幕座標矩形
    • BOOL *pfShowAbove:此參數會向提供者指出 中國ModifiedACList 矩形是否將自動完成清單放在輸入面板上方或下方。 應用程式可以使用這項資訊來正確繪製 UI 元素,例如調整控點和捲軸的大小。 提供者應該一開始傳入自動完成清單相對於 rcACList文字輸入欄位的方向。 如果用戶端將prcModifiedACList設定為rcACList,則用戶端不會變更pfShowAbove

    使用 中國ModifiedACListpfShowAbove out 引數的傳回值來定位並顯示 [自動完成清單] 視窗。 如果輸入面板未使用中, RequestShowUI 一律會傳回 TRUE而中國ModifiedACList 一律與 rcACList相同。 pfShowAbove 也保持不變,結果是呼叫不會影響應用程式行為。 下列範例程式碼說明這些做法。

HRESULT SampleProvider::Show(BOOL fShow)
{
    //Ask the AC client if it is OK to show the Autocomplete list.
    BOOL fAllowShowing = FALSE;
    m_spACClient->RequestShowUI(m_hWndList, &fAllowShowing);

    if (fShow && fAllowingShowing)
        {
            // Create the parameters required to call PreferredRects
            RECT rcField = //Rectangle for app's text field
            RECT rcACList = //Default rectangle for app's AC list
            RECT rcModifiedACList = {0, 0, 0, 0};
            BOOL fShowAbove = TRUE;

//Ask the AC client to modify the position of the AC list
m_spACClient->PreferredRects(&rcACList, &rcField,
&rcModifiedACList, &fShowAbove);

            //Show the Autocomplete UI at the modified preferred rectangle
            //from rcModifiedACList and the directional info provide by
//fShowAbove
            //...
        }
    else
        {
        //Hide the Autocomplete list and clean up
        //...
        }
    return S_OK;
}

當使用者在 [自動完成] 清單中選取專案時,提供者除了將選取的專案插入文字輸入欄位之外,還需要呼叫用戶端的 ITipAutocompleteClient::UserSelection 方法 。 輸入面板會使用此通知來捨棄尚未從輸入面板插入的所有剩餘文字。

最後,當不再需要提供者時,應該藉由呼叫 Autocomplete 用戶端的 ITipAutocompleteClient::UnadviseProvider 方法 取消註冊提供者,以取消連結提供者。 提供者可能需要取消註冊兩個原因之一:因為提供者相關聯的文字輸入欄位已經終結,或因為應用程式選擇只建立一個自動完成用戶端,而不是每個文字專案欄位一個。 在此實例中,每次將焦點切換離開文字欄位時,都必須取消註冊提供者。

結論

輸入面板自動完成整合是一項功能強大的工具,可改善 Windows 應用程式中的使用者體驗,包括平板電腦上自動完成清單。 若未整合,輸入面板使用者必須進行一次插入文字一個字元的繁瑣程式,並重新置放輸入面板,才能使用自動完成。 透過整合,自動完成清單會出現在方便的位置,因為使用者會在輸入面板中使用筆跡,增加文字輸入的速度和簡易度。 在包含以殼層自動完成或.NET Framework 3.0 自動完成為基礎建置的自動完成功能的應用程式中,輸入面板自動完成整合是免費且吸引人的功能。 此外,系統會提供一組簡單的 COM 型介面,以便為選擇使用自訂自動完成控制項的應用程式啟用相同的整合式體驗。

文字輸入面板參考