次の方法で共有


入力パネルオートコンプリートの使用

Windows Vista では、タブレット PC 入力パネルに新しいオートコンプリート機能が統合されており、ユーザーのインクが入力パネルで認識されると、アプリケーションのオートコンプリート リストをリアルタイムで更新できます。 さらに、アプリケーションのオートコンプリート リストは、入力パネルのユーザーにとって便利な場所に配置されます。 入力パネルオートコンプリートを使用しない場合、入力パネルでオートコンプリート機能を使用することは困難なプロセスであり、ユーザーはオートコンプリートの候補にアクセスするために一度に 1 文字ずつ挿入し、入力パネルを移動する必要があります。 統合により、オートコンプリートはタブレットPCユーザーのための強力なツールであり、入力パネルを使用してテキストを入力する速度と使いやすさを向上させます。

オートコンプリート リストを含む入力パネル

アプリケーションで入力パネルオートコンプリート統合を利用する方法には、3 つのオプションがあります。 (IAutoComplete インターフェイスを介して) シェル オートコンプリートを使用して構築されたオートコンプリート機能を含むアプリケーション、またはオートコンプリート (AutoCompleteMode 列挙を介して) .NET Frameworkオートコンプリートは、コード変更を必要とせずに入力パネルオートコンプリート統合を受け取ります。 カスタムオートコンプリート テキスト フィールドを含むアプリケーションでは、入力パネルオートコンプリート API を使用して同じ機能を取得できます。

いずれの場合も、アプリケーションがオートコンプリート リストを生成するために使用する UI または予測ロジックを複製または変更することなく、アプリケーションのオートコンプリート リストに対してこれらの変更を行うことができます。 オートコンプリート リストは引き続きアプリケーションによって描画される所有者であり、オートコンプリート リストの内容は、テキストが編集フィールドに直接入力された場合と同じです。

入力パネルオートコンプリート統合は、Windows Vista オペレーティング システム以降のバージョンでサポートされています。 入力パネルオートコンプリート統合は、Windows Vista 以降のシェル オートコンプリートと、.NET Framework バージョン 3.0 以降のWindows フォーム開発に組み込まれています。 IAutoCompleteAutoCompleteMode はどちらも以前のバージョンの Windows で実行されますが、入力パネルオートコンプリート統合は、Microsoft Windows XP Tablet PC Edition 以前のオペレーティング システムではサポートされていません。 以前のバージョンのタブレット PC で入力パネルオートコンプリートを実行すると、アプリケーションは統合前の動作に戻ります。

アプリケーションオートコンプリートリストと入力パネルを統合する理由

アプリケーションのオートコンプリート リストを統合すると、オートコンプリート機能を含むテキスト フィールドにテキストを入力するユーザーに対して、入力の最大限の容易さと速度を実現できます。 さらに、入力パネルオートコンプリート統合を含むアプリケーションは、タブレット PC を念頭に置いて開発されたかのようにすぐに表示され、タブレット PC ユーザーにとってより魅力的なアプリケーションになります。

入力パネルとオートコンプリート リストが統合なしで対話する方法

入力パネルを使用して、オートコンプリート リストを含むテキスト フィールドにテキストを入力しますが、入力パネルと統合されていません。

  1. ユーザーはテキスト フィールドにフォーカスを置き、入力パネルを開きます。
  2. ユーザーは 1 文字または 2 文字を書き込みます。
  3. ユーザーが [ 挿入] をタップします。 入力パネルは、アプリケーションのテキスト フィールドにテキストを入力します。 アプリケーションのオートコンプリートリストが表示され、入力パネルによって部分的または完全に隠されている可能性が高いです。
  4. ユーザーは入力パネルをドラッグして、アプリケーションのオートコンプリート リストを明らかにします。
  5. オートコンプリートリストに正しいエントリが含まれていると仮定すると、ユーザーはそのエントリを選択できるようになりました。それ以外の場合、ユーザーは手順 2 と 3 を繰り返す必要があります。

これは明らかに面倒なプロセスです。 オートコンプリート リストの動作に対するユーザーの期待は破線で表示され、タスクを実行する機能は低下します。

入力パネルとオートコンプリート リストの相互作用が統合と共に改善されるしくみ

入力パネルを使用して、入力パネルと統合されたオートコンプリート リストを含むテキスト フィールドにテキストを入力します。

  1. ユーザーはテキスト フィールドにフォーカスを置き、入力パネルを開きます。
  2. ユーザーは 1 文字または 2 文字を書き込みます。 ユーザーがテキストを書き込むと、アプリケーションのオートコンプリート リストが入力パネルの真上または真下に表示されます。
  3. ユーザーはオートコンプリートリストからエントリを選択します。エントリがアプリケーションのテキスト フィールドに直接挿入されるか、正しいエントリが表示されるまで手順 2 を繰り返します。

統合により、オートコンプリートリストが表示され、ユーザーが入力パネルに書き込んでいる間に更新されます。 さらに、リストは、ユーザーが書き込み中にアクセスするのに便利であり、入力パネルによって隠されないように配置されています。 最後に、ユーザーがオートコンプリート リストから項目を選択すると、項目はアプリケーションのテキスト入力フィールドに直接挿入されるため、ユーザーは入力パネルからテキストを挿入する手順をバイパスできます。

outlook express autocomplete リストを含む入力パネル

入力パネルオートコンプリート統合を含む標準オートコンプリート コンポーネント

IAutoCompleteAutoCompleteMode の両方に、入力パネルオートコンプリートの組み込みの統合が含まれています。 これらの標準オートコンプリート コンポーネントのいずれかを使用するアプリケーションでは、追加の作業がほとんどまたはまったくない入力パネルオートコンプリート機能を利用できます。 さらに、入力パネルオートコンプリートは Windows Vista または Windows オペレーティング システムの新しいバージョンでのみサポートされていますが、Windows Vista のリリース前に IAutoComplete を使用してビルドされたアプリケーションは、Windows Vista で実行すると、入力パネルオートコンプリート統合が自動的に取得されます。 次のセクションでは、入力パネルオートコンプリート統合を含む特定の IAutoComplete 要素と AutoCompleteMode 要素について詳しく説明します。

入力パネルオートコンプリート統合を使用したシェル オートコンプリート

IAutoComplete を使用するアプリケーションは、入力パネルオートコンプリート統合を無料で利用できます。 シェル オートコンプリート API は Windows 2000 以降に含まれていますが、入力パネルオートコンプリート統合は Windows Vista 以降のバージョンでのみサポートされています。 ただし、 IAutoComplete を使用する Windows Vista のリリースより前にビルドされたアプリケーションでは、Windows Vista で実行すると、入力パネルオートコンプリート統合が自動的に取得されます。

この方法で Tablet Autocomplete を利用するには、オートコンプリート オブジェクト (CLSID_Autocomplete) を使用する必要があります。 URL またはファイル名にオートコンプリート機能を提供する場合は、 SHAutoComplete 関数を使用してオートコンプリート オブジェクトを作成します。

IAutoComplete に加えて、IAutoComplete2 または IAutoCompleteDropDownを直接実装しても、入力パネルオートコンプリート統合を自動的に取得できます。

入力パネルのオートコンプリートと.NET Framework アプリケーションの統合

.NET Framework 3.0 以降では、オートコンプリートWindows フォームテキスト ボックスが含まれています。 Windows フォームテキストボックスオートコンプリートはシェルオートコンプリートの上に構築されています。つまり、入力パネルオートコンプリート統合も組み込まれています。 .NET Framework 3.0 は、Windows Vista より前にリリースされた Windows エディションではダウン レベルでサポートされています。 ただし、入力パネルオートコンプリート統合は Windows Vista 以降のバージョンでのみサポートされているため、入力パネルオートコンプリート統合は、Windows Vista 以降のバージョンにインストールされている場合、.NET Framework 3.0 アプリケーションでのみ機能します。

.NET Framework 3.0 で入力パネルオートコンプリート統合を利用するアプリケーションでは、AutoCompleteMode プロパティが有効になっているWindows フォーム TextBox を使用する必要があります。 入力パネルオートコンプリート統合を利用するために、Windows フォームオートコンプリートを機能させる以外に追加の作業を行う必要はありません。

入力パネルオートコンプリート API を直接使用する

カスタムオートコンプリートテキストボックスの開発者は、入力パネルオートコンプリート統合がアプリケーションで可能にする改善されたテキスト入力エクスペリエンスを得るために、入力パネルオートコンプリート API を直接操作する必要があります。 入力パネルオートコンプリート API は、Windows Vista オペレーティング システムの一部として、および Tablet Platform SDK バージョン 1.9 以降の一部として含まれています。 入力パネルオートコンプリート インターフェイスは COM ベースのインターフェイスです。

次のセクションでは、C++ アプリケーションでのこれらのインターフェイスの動作について詳しく説明します。 ただし、これらの COM インターフェイスは、COM 相互運用機能を使用して、C# を含むほとんどの言語で実装できます。

入力パネルオートコンプリート統合をカスタムオートコンプリート テキスト ボックスに実装するために必要な 2 つのインターフェイスは、 ITipAutocompleteProvider インターフェイスITipAutocompleteClient インターフェイスです。 これらのインターフェイスの定義は、TipAutoComplete.h および TipAutoComplete_i.c にあります。

最初に、オートコンプリート リストを含む各テキスト 入力フィールドに ITipAutocompleteProvider を実装する Autocomplete プロバイダー クラスをアプリケーションで定義してインスタンス化する必要があります。 このクラスは、オートコンプリート統合のアプリケーション側を管理します。 入力パネルからのオートコンプリート要求はすべて、オートコンプリート クライアントからアプリケーションのオートコンプリート プロバイダーを介してアプリケーションに送信されます。 アプリケーションのオートコンプリート プロバイダーは、アプリケーションのオートコンプリート リストの HWND と、関連付けられているテキスト入力フィールドの HWIND の両方にアクセスできる必要があります。 さらに、 ITipAutocompleteProvider の次のメソッドを実装する必要があります。

  • ITipAutocompleteProvider::UpdatePendingText メソッド: このメソッドは、ユーザーが入力パネルに書き込んだテキストをアプリケーションに通知するためにオートコンプリート クライアントによって使用されます。 この通知を受け取ると、プロバイダーは、アプリケーションのテキスト入力フィールドにテキストが入力されたかのようにオートコンプリート リストを生成します。 ITipAutocompleteProvider::UpdatePendingText メソッドを使用してオートコンプリート プロバイダーに渡す文字列には、現在入力パネル内のテキストのみが含まれます。 したがって、テキスト入力フィールドに追加のテキストがある場合は、プロバイダーがクライアントから送信されたテキストに適切に追加する必要があります。 ITipAutocompleteProvider::UpdatePendingText メソッドによって渡される文字列は、フィールド内の現在の選択範囲の代わりとして扱う必要があります。 現在の選択範囲がない場合は、現在のカーソル位置に配置する必要があります。 オートコンプリートリストが生成されたら、プロバイダーは TRUE を渡して ITipAutocompleteProvider::Show メソッドを呼び出してオートコンプリートリストを表示する必要があります。 アプリケーションは 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 関数を使用して、クラス ID がCLSID_TipAutoCompleteClientITipAutocompleteClient インターフェイスのインスタンスをインプロセス サーバーとして生成し、プロバイダーをクライアントに登録する必要があります。 Autocomplete クライアント ITipAutocompleteClient::AdviseProvider メソッド は、クライアントがアプリケーションのオートコンプリート プロバイダー オブジェクトを呼び出せるようにプロバイダーをクライアントに登録します。 tiptsf.dllがシステムに存在しない場合、 CoCreateInstance 関数は失敗し、 REGDB_E_CLASSNOTREGを返します。 この時点で、アプリケーションは ITipAutocompleteProvider オブジェクトを破棄し、入力パネルが存在しないかのように続行できます。これは、このようなシステム上にないためです。

アプリケーションでは、 ITipAutocompleteClient のインスタンスを 1 つ作成することも、テキスト フィールドごとに 1 つのインスタンスを作成することもできます。 最初のオプションでは、フォーカスが変更されるたびにプロバイダーの登録を解除して登録する必要があります。 オートコンプリート プロバイダーの登録解除の詳細については、このトピックの後半で説明します。

オートコンプリート プロバイダー (アプリケーション) とオートコンプリート クライアント (入力パネル) の間で調整する必要があるオートコンプリート リストの配置には、いくつかの手順が必要です。 オートコンプリート プロバイダーの Show メソッドの呼び出しの結果として、またはユーザーがキーボードを使用してテキストを入力したために、オートコンプリート リストが表示される前に、プロバイダーはオートコンプリート リストの配置先についてクライアントに問い合わせてください。 プロバイダーは、次の手順を実行する必要があります。

  • オートコンプリート クライアントの ITipAutocompleteClient::RequestShowUI メソッド を使用して、入力パネルにオートコンプリート リストを表示する準備ができているかどうかを確認します。 RequestShowUI は、Autocomplete リスト ウィンドウの HWND である HWND パラメーターを受け取り、オートコンプリート リストを表示できる状態であるかどうかを示すために TRUE または FALSE を 返します。 クライアントから FALSE が返された場合、プロバイダーはオートコンプリートリストの表示を試みないようにしてください。

  • ITipAutocompleteClient::P referredRects メソッドを呼び出す前に、ポップアップオートコンプリート リスト ウィンドウ ハンドルを設定するには、RequestShowUI を呼び出します。 これを行わないと、PreferredRects を呼び出すときにE_INVALIDARG エラーが発生します。

  • RequestShowUITRUE を返す場合、プロバイダーはテキスト入力フィールドの場所に基づいてオートコンプリート リストの既定の画面座標四角形を計算し、Autocomplete クライアントの ITipAutocompleteClient::P referredRects メソッドを呼び出す必要があります。 これにより、オートコンプリート クライアントは、オートコンプリート リストが入力パネルと重複しないように四角形を調整できます。 PreferredRects メソッドは、次の 4 つのパラメーターを受け取ります。

    • RECT rcACList: オートコンプリート リストの既定の画面座標四角形。
    • RECT rcField: 対応するテキスト入力フィールドの画面座標四角形。
    • RECT *prcModifiedACList: オートコンプリートの調整された画面座標四角形
    • BOOL *pfShowAbove: このパラメーターは、 prcModifiedACList 四角形がオートコンプリート リストを入力パネルの上または下に配置するかどうかをプロバイダーに示します。 アプリケーションでは、この情報を使用して、サイズ変更ハンドルやスクロール バーなどの UI 要素を正しく描画できます。 プロバイダーは、最初に、オートコンプリート リストが rcACList のテキスト入力フィールドを基準にして配置される方向を渡す必要があります。 prcModifiedACListrcACList に等しい場合、クライアントは pfShowAbove を変更しません。

    prcModifiedACList 引数と pfShowAbove out 引数の戻り値を使用して、オートコンプリート リスト ウィンドウを配置して表示します。 入力パネルが使用されていない場合、 RequestShowUI は常に TRUE を 返し、 prcModifiedACListrcACList と常に同じです。 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 メソッド を呼び出す必要があります。 入力パネルでは、この通知を使用して、入力パネルからまだ挿入されていない残りのテキストをすべて破棄します。

最後に、プロバイダーが不要になったら、オートコンプリート クライアントの ITipAutocompleteClient::UnadviseProvider メソッド を呼び出してプロバイダーの登録を解除することで、オートコンプリート クライアントからプロバイダーのリンクを解除する必要があります。 プロバイダーの登録を解除する必要がある理由は、プロバイダーが関連付けられているテキスト入力フィールドが破棄されたため、またはアプリケーションがテキスト入力フィールドごとに 1 つではなく、1 つの Autocomplete クライアントのみを作成することを選択したためです。 この場合、フォーカスがテキスト フィールドから切り替えられるたびに、プロバイダーの登録を解除する必要があります。

まとめ

入力パネルオートコンプリート統合は、タブレット PC のオートコンプリート リストを含む Windows アプリケーションのユーザー エクスペリエンスを向上させるための強力なツールです。 統合されていない場合、入力パネルのユーザーは、オートコンプリートを使用するために、テキストを一度に 1 文字ずつ挿入し、入力パネルの位置を変更する面倒なプロセスを実行する必要があります。 統合により、オートコンプリート リストは、ユーザーが入力パネルでインクを入力すると便利な場所に表示され、テキスト入力の速度と使いやすさの両方が向上します。 シェル オートコンプリートまたは .NET Framework 3.0 オートコンプリートの上に構築されたオートコンプリート機能を含むアプリケーションでは、入力パネルオートコンプリート統合は無料で魅力的な機能です。 さらに、COM ベースのインターフェイスの単純なセットが提供され、カスタムオートコンプリート コントロールの使用を選択したアプリケーションでも同じ統合エクスペリエンスが可能になります。

テキスト入力パネルリファレンス