共用方式為


使用輸入面板自動完成

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

輸入面板與 IE 自動完成清單

有三個選項可讓應用程式利用輸入面板自動完成整合。 包含使用 Shell 自動完成所建置之自動完成功能的應用程式(透過 IAutoComplete 介面)或 .NET Framework 自動完成(透過 AutoCompleteMode 列舉)會自動整合輸入面板的自動完成功能,而不需要變更程式代碼。 包含自訂自動完成文字欄位的應用程式可以使用輸入面板自動完成 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 上執行時,使用 IAutoComplete 的 Windows Vista 版本之前建置的應用程式會自動取得輸入面板自動完成整合。

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

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

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

從 .NET Framework 3.0 開始,Windows Forms 文本框包含自動完成。 Windows Forms 文本框自動完成功能建立在系統殼層自動完成之上,這表示輸入面板的自動完成功能也已內建整合。 .NET Framework 3.0 在發行於 Windows Vista 之前的 Windows 版本上仍提供支援。 不過,由於只有在 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 Interop 的使用,這些 COM 介面可以在大多數語言中實現,包括 C#。

為了在自定義自動完成文本框中實作輸入面板自動完成整合,兩個必要的介面是 ITipAutocompleteProvider 介面ITipAutocompleteClient 介面。 這些介面的定義位於 TipAutoComplete.h 和 TipAutoComplete_i.c。

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

  • ITipAutocompleteProvider::UpdatePendingText 方法:此方法由自動完成客戶端使用,以通知應用程式使用者已在輸入面板中輸入的文字。 收到此通知後,提供者負責產生自動完成清單,就像將文字輸入到應用程式的文字輸入欄位中一樣。 字串會通過 ITipAutocompleteProvider::UpdatePendingText 方法傳遞至 Autocomplete 提供者, 只包含目前在輸入面板中的文字。 因此,如果文字輸入欄位中有其他文字,提供者必須負責適當地將它附加至用戶端所傳送的文字。 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呼叫的,但也可以在任何時候由自動完成的客戶端呼叫。 在收到此呼叫時,自動完成提供者必須隱藏或顯示參數所指示的自動完成提供者。 在顯示自動完成清單之前,自動完成提供者應該先諮詢自動完成用戶端關於自動完成清單的位置。 本文稍後會出現有關定位自動完成清單的詳細資訊。

接下來,應用程式應該使用 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 參數,此參數代表 Autocomplete 清單視窗的 HWND。該方法返回 TRUEFALSE,顯示 Autocomplete 清單是否可以顯示的狀態。 如果客戶端傳回 FALSE,提供者不應該嘗試顯示自動完成清單。

  • 呼叫 RequestShowUI,在呼叫 ITipAutocompleteClient::PreferredRects 方法之前,先設定快顯自動完成清單視窗句柄。 未能這樣做會在呼叫 PreferredRects時導致 E_INVALIDARG 錯誤。

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

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

    使用 prcModifiedACListpfShowAbove out 自變數的傳回值來定位和顯示自動完成清單視窗。 如果輸入面板未被使用,RequestShowUI 總是傳回 TRUE,且 prcModifiedACList 總是與 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 方法,將提供者從 Autocomplete 用戶端中取消註冊。 提供者可能需要取消註冊,其原因之一可能是其所關聯的文字輸入欄位已被銷毀,或是應用程式選擇只建立一個自動完成用戶端,而不是為每個文字輸入欄位各自建立一個。 當每次將焦點從文字欄位切換出去時,必須取消註冊這個提供者。

結論

輸入面板自動完成整合是一項功能強大的工具,可改善 Windows 應用程式中的用戶體驗,包括平板電腦上的自動完成清單。 若未整合,輸入面板用戶必須經過一個繁瑣的過程,一次輸入一個字元,並重新定位輸入面板,以便使用自動完成功能。 透過整合,自動完成清單會在使用者於輸入面板中書寫時出現在方便的位置,進而提高文字輸入的速度和便利性。 在包含基於 Shell 自動完成或 .NET Framework 3.0 自動完成功能的應用程式中,輸入面板自動完成的整合提供了免費且具吸引力的功能。 此外,也會提供一組簡單的 COM 介面,以便為選擇使用自定義自動完成控件的應用程式啟用相同的整合式體驗。

文字輸入面板參考