これらのガイドラインと要件は、標準の QWERTY キーボードでは簡単に表現できない言語でユーザーがテキストを入力するのに役立つカスタム入力方法エディター (IME) を開発するのに役立ちます。
IME の概要については、「 入力メソッド エディター (IME)」を参照してください。
既定の IME
ユーザーは、任意のアクティブな IME (設定 -> 時刻と言語 -> 言語 -> 優先言語 -> 言語パック - オプション) を選択して、優先言語の既定の IME にすることができます。
優先言語の言語オプション設定画面で、既定のキーボードを選択します。
Important
カスタム IME の既定のキーボードを設定するためにレジストリに直接書き込むことはお勧めしません。
互換性の要件
カスタム IME の基本的な互換性要件を次に示します。
IME は Windows アプリと互換性がある必要があります
Text Services Framework (TSF) を使用して IME を実装します。 以前は、入力サービスに Input Method Manager (IMM32) を使用するオプションがありました。 これで、システムは Input Method Manager (IMM32) を使用して実装される IME をブロックします。
アプリが起動すると、ユーザーが現在選択している IME の IME DLL が TSF によって読み込まれます。 IME が読み込まれると、アプリと同じアプリ コンテナーの制限が適用されます。 たとえば、アプリがマニフェストでインターネット アクセスを要求していない場合、IME はインターネットにアクセスできません。 この動作により、IME がセキュリティ コントラクトに違反できなくなります。
TSF は、アプリと IME の仲介役です。 TSF は入力イベントを IME に伝達し、ユーザーが文字を選択した後に IME から入力文字を受信します。
この動作は以前のバージョンの Windows と同じですが、Windows アプリに読み込まれると、IME の潜在的な機能に影響します。
IME で Windows アプリとデスクトップ アプリ間で異なる機能または UI を提供する必要がある場合は、TSF によって読み込まれる DLL によって、読み込まれるアプリの種類が確認されることを確認します。 IME で ITfThreadMgrEx::GetActiveFlags メソッドを呼び出し、TF_TMF_IMMERSIVEMODE フラグを確認して、IME によって結果に応じて異なるアプリケーション ロジックがトリガーされるようにします。
Windows アプリでは、Table Text Service (TTS) IME はサポートされていません。
注
TTS IME を生成するための一部のツールでは、Windows によってマルウェアとしてマークされた IME が生成されます。
IME はシステム トレイと互換性がある必要があります
IME アイコンをホストする言語バーはありません。 代わりに、現在の入力オプションを示す入力インジケーターがシステム トレイに表示されます。 入力インジケーターには、現在実行中の IME を示す IME ブランド アイコンのみが表示されます。 また、ユーザーが IME のオンとオフを切り替えるなど、最も一般的に使用される IME モード スイッチを実行するための IME ブランド 化アイコンの左側に表示される IME モード アイコンが 1 つあります。
入力インジケーターには、互換性のある IME に対してのみ IME ブランド 化アイコンとモード アイコンが表示されます。 互換性のない IME には、ブランド化アイコンとモード アイコンがシステム トレイに表示されません。 代わりに、入力インジケーターには、IME ブランド 化アイコンの代わりに言語の省略形が表示されます。
スタンドアロンの.ico ファイルではなく、DLL または EXE ファイルに IME アイコンを格納します。 IME アイコンの設計は、次の UI 設計ガイドラインセクションで説明されているガイドラインに従う必要があります。
IME ブランド 化アイコン
入力インジケーターは、IME がシステムに登録されたときに IME によって定義されたリソース ID を使用して、IME DLL から IME ブランド化アイコンを取得します。
IME モード アイコン
一部の IME では、IME モード アイコンを表示するために、システム トレイに表示されている入力インジケーターに依存する必要があります。 この場合、IME は、GUID_LBI_INPUTMODEを使用して IME モード アイコンを入力インジケーターに渡します。
システム トレイの入力インジケーターに IME モード アイコンを渡す場合、IME モード アイコンの既定のサイズは 16 x 16 ピクセルです。 UI のスケーリングは DPI に従います。
UAC の入力インジケーター (Secure Desktop のユーザー アカウント 制御) に IME モード アイコンを渡す場合、IME モード アイコンの既定のサイズは 20 x 20 ピクセルです。 UAC の IME モードアイコンの UI スケーリングは、PPI に従います。
IME はアプリ コンテナーで動作する必要があります
一部の IME 関数は、アプリ コンテナーで影響を受けます。
- ディクショナリ ファイル - 多くの場合、IME には、ユーザー入力を特定の文字にマップするための読み取り専用のディクショナリ ファイルがあります。 アプリ コンテナー内からこれらのファイルにアクセスするには、IME でプログラム ファイルまたは Windows ディレクトリの下にファイルを配置する必要があります。 既定では、これらのディレクトリはアプリ コンテナーから読み取ることができるため、IME はこれらの場所に格納されているディクショナリ ファイルにアクセスできます。 IME が辞書ファイルを別の場所に格納する必要がある場合は、アプリ コンテナーからのアクセスを許可するために、ディクショナリ ファイルの アクセス制御リスト (ACL) を明示的に操作する必要があります。
- インターネット更新 - IME がインターネットからのデータを使用して辞書を更新する必要がある場合、インターネット アクセスが常に許可されるとは限らないため、アプリ コンテナー内でディクショナリを更新することはできません。 代わりに、IME は、インターネットからのデータを使用して辞書ファイルを更新する別のデスクトップ プロセスを実行する必要があります。
- オンザフライ学習 - インターネットにアクセスできるアプリ コンテナーで IME が実行されている場合、IME が通信できるエンドポイントに制限はありません。 この場合、IME はクラウド サーバーを使用して、オンザフライの学習サービスを提供できます。 一部の IME では、ユーザーが入力している間、その場でユーザー入力をダウンロードしてアップロードします。 アプリ コンテナーではインターネット アクセスが保証されないため、常に許可されるとは限りません。
- プロセス間で情報を共有 する - IME では、異なるアプリ コンテナー内のアプリ間でユーザーの入力設定に関するデータを共有することが必要になる場合があります。 Web サービスを使用してアプリ間でデータを共有します。
Important
アプリコンテナーのセキュリティ規則を回避しようとすると、IME がマルウェアとして扱われ、ブロックされる可能性があります。
IME とタッチ キーボード
IME では、候補ウィンドウの UI やその他の UI 要素がタッチ キーボードの下に描画されないようにする必要があります。 タッチ キーボードは、すべてのアプリよりも高い z オーダーバンドで表示され、IME UI はアクティブなアプリと同じ z オーダー バンドで表示されます。 その結果、タッチ キーボードは重なり合い、IME UI を非表示にすることができます。 ほとんどの場合、アプリはタッチ キーボードを考慮してウィンドウのサイズを変更する必要があります。 アプリのサイズが変更されない場合でも、IME は InputPane API を使用してタッチ キーボードの位置を取得できます。 IME は Location プロパティに対してクエリを実行するか、タッチ キーボードの Show イベントと Hide イベントのハンドラーを登録します。 Show イベントは、タッチ キーボードが現在表示されている場合でも、ユーザーが編集フィールドをタップするたびに発生します。 IME では、この API を使用して、IME が候補 (または他の) UI を描画する前にタッチ キーボードで使用される画面領域を取得したり、IME UI をリフローしてタッチ キーボードの下に描画しないようにしたりできます。
優先タッチ キーボード レイアウトの指定
IME では、使用するタッチ キーボード レイアウトを指定でき、IME はタッチ最適化レイアウトを操作できます。 この機能は、韓国語、日本語、簡体字中国語、繁体字中国語の IME に限定されています。
タッチ キーボードでサポートされているレイアウトは 7 つあり、そのうちの 3 つが従来のレイアウトで、そのうちの 4 つがタッチ最適化レイアウトです。 従来のレイアウトは、物理キーボードのように見え、動作します。
3 つのクラシック レイアウトはすべて、異なる形式で繁体字中国語を入力するためのレイアウトです。
- ふりがなベースの入力
- Changjie の入力
- Dayi入力
従来のレイアウトに加えて、韓国語、日本語、簡体字中国語、繁体字中国語の各入力言語に 1 つのタッチ最適化レイアウトがあります。
この機能を使用するには、IME が Text Services Framework ITfFunctionProvider API を使用して IME によってエクスポートされる ITfFnGetPreferredTouchKeyboardLayout インターフェイスを実装する必要があります。
IME が ITfFnGetPreferredTouchKeyboardLayout インターフェイスをサポートしていない場合、IME を使用すると、タッチ キーボードで表示される言語の既定のクラシック レイアウトになります。
IME でクラシック レイアウトの 1 つを優先レイアウトとして設定する必要がある場合は、ITfFnGetPreferredTouchKeyboardLayout インターフェイスと ITfFunctionProvider インターフェイスをサポートする以外に、IME 側で追加の作業は必要ありません。 ただし、タッチ最適化レイアウトを操作するには、IME で追加の作業が必要です。これについては、次のセクションで説明します。
タッチ最適化レイアウト
韓国語、日本語、簡体字中国語、繁体字中国語の各入力言語用のタッチ最適化キーボードは、IME On 変換モードと IME Off 変換モードで異なるレイアウトを表示します。 タッチ キーボードには、IME 変換モードをオンまたはオフに設定するためのキーがありますが、編集コントロール間でフォーカスが変化すると、キーボードの IME モードも変更される可能性があります。
日本語、簡体字中国語、繁体字中国語の入力言語用のタッチ最適化キーボードには、IME が候補ページ間を移動するために使用するキーが含まれています。 日本語と簡体字中国語の場合、候補ページ キーはタッチ最適化レイアウトに表示されます。 繁体字中国語の場合、前のページと次の候補ページには別々のキーがあります。
これらのキーを押すと、タッチ キーボードは SendInput 関数を呼び出して、次の Unicode プライベート使用領域文字をフォーカスされたアプリケーションに送信します。この文字は、IME がインターセプトして操作できます。
- 次のページ (0xF003) - 候補ページ キーが日本語と簡体字中国語のタッチ最適化キーボードで押されたとき、または次のページ キーが繁体字中国語のタッチ最適化キーボードで押されたときに送信されます。
- 前のページ (0xF004) - 候補ページ キーが日本語と簡体字中国語のタッチ最適化キーボードの Shift キーと同時に押されたとき、または前のページ キーが繁体字中国語のタッチ最適化キーボードで押されたときに送信されます。
これらの文字は Unicode 入力として送信されます。 次の段落では、Text Services Framework IME が受信するキー イベント シンク通知中に文字情報を抽出する方法について詳しく説明します。 これらの文字値はどのヘッダー ファイルにも定義されていないため、コードで定義する必要があります。
キーボード入力をインターセプトするには、IME をキー イベント シンクとして登録する必要があります。 SendInput 関数を使用して生成される Unicode 入力の場合、 ITfKeyEventSink コールバック (OnKeyDown、OnKeyUp、OnTestKeyDown、OnTestKeyUp) の WPARAM パラメーターには、常に仮想キー VK_PACKETが含まれており、文字が直接識別されることはありません。
文字にアクセスするには、次の呼び出しシーケンスを実装します。
// Keyboard state
BYTE abKbdState[256];
if (!GetKeyboardState(abKbdState))
{
return 0;
}
// Map virtual key to character code
WCHAR wch;
if (ToUnicode(VK_PACKET, 0, abKbdState, &wch, 1, 0) == 1)
{
return wch;
}
IME 検索の統合
検索コントラクトと検索ウィンドウとの統合を通じて、ユーザーに検索機能を提供します。
検索ウィンドウと IME の提案
検索ウィンドウは、ユーザーがすべてのアプリで検索を実行するための中心的な場所です。 IME ユーザー向けに、Windows は、互換性のある IME を Windows と統合して効率と使いやすさを向上させる独自の検索エクスペリエンスを提供します。
検索と互換性のある IME を使用して入力したユーザーには、主に次の 2 つの利点があります。
- IME と検索エクスペリエンスの間のシームレスな対話。 IME 候補は、検索候補を隠さずに検索ボックスの下にインラインで表示されます。 ユーザーはキーボードを使用して、検索ボックス、IME 変換候補、検索候補の間をシームレスに移動できます。
- アプリケーションによって提供される関連する結果と提案にすばやくアクセスできます。 アプリは、より関連性の高い提案を提供するために、現在の変換候補すべてにアクセスできます。 検索候補に優先順位を付けるために、関連性の高い順にアプリに変換が行われます。 ユーザーは、ふりがなを入力するだけで、変換せずに目的の結果を見つけて選択します。
IME は、次の条件を満たしている場合、統合された検索エクスペリエンスと互換性があります。
- Windows スタイルのシェルと互換性があります。
- TSF UILess モード API を実装します。 詳細については、「 UI レス モードの概要」を参照してください。
- TSF 検索統合 API、 ITfFnSearchCandidateProvider 、および ITfIntegratableCandidateListUIElement を実装します。
検索ウィンドウでアクティブ化すると、互換性のある IME が UIless モードになり、その UI を表示できません。 代わりに、前のスクリーンショットに示すように、変換候補が Windows に送信され、インライン候補リスト コントロールに表示されます。
また、IME は、現在の検索を実行するために使用する必要がある候補を送信します。 これらの候補は、変換候補と同じでも、検索用に調整することもできます。
適切な検索候補は、次の条件を満たしています。
- プレフィックスの重複はありません。 たとえば、一方がもう一方のプレフィックスであるため、北京大学と北京は冗長です。
- 冗長な候補はありません。 冗長な候補は、結果のフィルター処理には役立たないため、検索には役立ちません。 たとえば、北京大学と一致する結果は、北京にも一致します。
- 予測候補なし、変換のみ。 たとえば、ユーザーが "be" と入力した場合、IME は北を候補として返すことができますが、北京大学は返しません。 通常、予測候補は制限が厳しすぎます。
条件を満たしていない IME は、他のコントロールと同じ方法で検索表示と互換性がなく、UI 統合と検索候補を利用できません。 アプリは、ユーザーが作成を完了した後にのみクエリを受け取ります。
検索コントラクトをサポートするアプリがクエリを受け取ると、クエリ イベントには、最も関連性の高い (可能性が高い) から最も関連性の低い (可能性の低い) 順にランク付けされたすべての既知の代替手段を含む "queryTextAlternatives" 配列が含まれます。
代替手段が提供された場合、アプリは各代替候補をクエリとして扱い、いずれかの代替候補に一致するすべての結果を返す必要があります。 アプリは、ユーザーが同時に複数のクエリを発行したかのように動作し、基本的に結果を提供する "または" クエリをサービスに発行する必要があります。 パフォーマンスに関する考慮事項のために、アプリでは多くの場合、最も関連性の高い代替手段の 5 ~ 20 に一致が制限されます。
UI の設計ガイドライン
すべての IME は、「 Windows アプリの設計とコード化」で説明されているユーザー エクスペリエンス ガイドラインに従う必要があります。
スティッキーウィンドウを使用しない
IME ウィンドウは必要なときにのみ表示され、常に表示されるわけではありません。 ユーザーが入力する必要がない場合、IME ウィンドウは表示されません。 IME ウィンドウを全画面表示にすることはできません。 IME ウィンドウが互いに重ならないようにする必要があります。 ウィンドウは Windows スタイルで設計し、UI のスケーリングに従う必要があります。
IME アイコン
IME アイコンには、ブランド化アイコンとモード アイコンの 2 種類があります。 すべての IME アイコンは、黒と白の色のみで設計する必要があります。 新しい IME アイコンは、システム トレイ アイコンのグリフの外観から借用されます。 このスタイルは、すべての言語が家族の外観を補完し、互いに区別するためにそれを使用できるように作成されています。
IME アイコンのファイル形式は ICO です。 次のアイコン サイズを指定する必要があります。
- 16 x 16 ピクセル
- 20 x 20 ピクセル
- 24 x 24 ピクセル
- 32 x 32 ピクセル
- 40 x 40 ピクセル
- 48 x 48 ピクセル
アルファ チャネルを含む 32 ビット アイコンがすべての解像度で提供されていることを確認します。
IME ブランド アイコンは、モダン な書体でレンダリングされた文字体裁グリフが配置される白いボックスによって定義されます。 各定義グリフは、各言語チームによって選択されます。 グリフは黒です。 ボックスには、50% 不透明度で黒で 1 ピクセルの外側のストロークが含まれています。 "新規" バージョンは、ボックスの左上にある丸い角で定義されます。
IME モードアイコンは、50% 不透明度の黒で 1 ピクセルの外側のストロークを含むモダンなフォントの白いタイポグラフィグリフによって定義されます。
| Icon | Description |
|---|---|
|
|
繁体字中国語 ChangeJie の IME ブランド アイコンの例。 |
|
|
繁体字中国語 ChangeJie の IME ブランド アイコンの例。 |
|
|
例 IME モード アイコン。 |
オーナーウィンドウ
候補 UI を表示するには、IME でウィンドウを所有ウィンドウに設定して、現在実行中のアプリに表示できるようにする必要があります。 ITfContextView::GetWnd メソッドを使用して、所有するウィンドウを取得します。 GetWnd がエラーまたは NULLHWND を返す場合は、 GetFocus 関数を呼び出します。
if (FAILED(pView->GetWnd(&parentWndHandle)) || (parentWndHandle == nullptr)) { parentWndHandle = GetFocus(); }
IME 候補ウィンドウとライトディスミスサーフェスの相互作用
ポップアップ ウィンドウの無視モデルは、ユーザーがこのようなウィンドウを簡単に閉じるので、"簡易無視" と呼ばれます。 IME が Windows 対話モデルで適切に機能するためには、IME ウィンドウが簡易無視モデルに参加している必要があります。
簡易無視モデルに参加するには、 NotifyWinEvent 関数または同様の関数を使用して、IME で 3 つの新しい Windows イベントを発生させる必要があります。 これらの新しいイベントは次のとおりです。
- EVENT_OBJECT_IME_SHOW - IME が表示されたら、このイベントを発生させます。
- EVENT_OBJECT_IME_HIDE - IME が非表示のときにこのイベントを発生させます。
- EVENT_OBJECT_IME_CHANGE - IME が移動またはサイズ変更されたときに、このイベントを発生させます。
互換性の宣言
IME では、 ITfCategoryMgr::RegisterCategory を使用して IME のカテゴリ GUID_TFCAT_TIPCAP_IMMERSIVESUPPORTを登録することで、互換性があることを宣言します。
既定の IME モードをオンに設定する
IME に対してより優れた UX を提供します。
デスクトップ アプリケーションの DPI スケーリングのサポート
拡張 DPI スケーリングのサポートにより、各デスクトップ プロセスの宣言された DPI 認識レベルに対してクエリを実行して、UI をスケーリングする必要があるかどうかを判断できます。 マルチモニター のシナリオでは、Windows は各モニター上の異なる DPI 設定に合わせて UI を適切にスケーリングします。
IME は各アプリケーションのプロセスのコンテキストで実行されるため、IME の DPI 認識レベルを宣言しないでください。 これにより、IME が現在のプロセスの DPI 認識レベルで実行されるようになります。
すべての IME UI 要素が、実行中のプロセスの UI 要素と同等のスケーリングを行うには、さまざまな DPI 値に適切に応答する必要があります。
注
新しいデスクトップ アプリケーションとの同等性を確保するために、IME ではモニターと DPI の認識をサポートする必要がありますが、認識レベル自体を宣言しないでください。 システムは、各シナリオで適切なスケーリング要件を決定します。
デスクトップ アプリケーションの DPI スケーリングサポート要件の詳細については、「 高 DPI」を参照してください。
IME のインストール
Microsoft Visual Studio を使用して IME をビルドする場合は、Flexera Software の InstallShield などのサード パーティ製インストーラーを使用して、IME のインストール エクスペリエンスを作成します。
次の手順では、InstallShield を使用して IME DLL のセットアップ プロジェクトを作成する方法を示します。
- Visual Studio をインストールします。
- Visual Studio を起動します。
- [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト] を選択します。 [ 新しいプロジェクト] ダイアログが開きます。
- 左側のウィンドウで、[ テンプレート] > [その他のプロジェクトの種類] > [セットアップと配置] に移動し、[ InstallShield Limited Edition を有効にする] をクリックして、[ OK] をクリックします。 インストールの指示に従ってください。
- Visual Studio を再起動します。
- IME ソリューション (.sln) ファイルを開きます。
- ソリューション エクスプローラーで、ソリューションを右クリックし、[ 追加] をポイントして、[ 新しいプロジェクト] を選択します。 [ 新しいプロジェクトの追加] ダイアログが開きます。
- 左側のツリー ビュー コントロールで、[ テンプレート] > [その他のプロジェクトの種類] > InstallShield Limited Edition に移動します。
- 中央のウィンドウで、[ InstallShield Limited Edition Project] をクリックします。
- [ 名前 ] テキスト ボックスに「SetupIME」と入力し、[OK] をクリック します。
- [ プロジェクト アシスタント ] ダイアログで、[ アプリケーション情報] をクリックします。
- 会社名とその他のフィールドを入力します。
- [ アプリケーション ファイル] をクリックします。
- 左側のウィンドウで、[ INSTALLDIR] フォルダーを右クリックし、[ 新しいフォルダー] を選択します。 フォルダーに "Plugins" という名前を付けます。
- [ ファイルの追加] をクリックします。 IME DLL に移動し、 Plugins フォルダーに追加します。 IME ディクショナリに対してこの手順を繰り返します。
- IME DLL を右クリックし、[プロパティ] を選択 します。 [プロパティ] ダイアログが開きます。
- [ プロパティ ] ダイアログで、[ COM] タブの [.NET 設定] タブをクリックします。
- [ 登録の種類] で [ 自己登録 ] を選択し、[OK] をクリック します。
- ソリューションをビルドします。 IME DLL がビルドされ、InstallShield によって、ユーザーが Windows に IME をインストールできる setup.exe ファイルが作成されます。
独自のインストール エクスペリエンスを作成するには、 ITfInputProcessorProfileMgr::RegisterProfile メソッドを呼び出して、インストール時に IME を登録します。 レジストリ エントリを直接書き込むことはありません。
インストール直後に IME を使用できる必要がある場合は、 InstallLayoutOrTip を呼び出して、psz パラメーターに次の形式を使用して、ユーザーが有効な入力メソッドに IME を追加します。
<LangID 1>:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
IME アクセシビリティ
IME をアクセシビリティ要件に準拠させ、ナレーターと連携させるには、次の規則を実装します。 候補リストにアクセスできるようにするには、IME がこの規則に従っている必要があります。
- 候補リストには、変換候補のリストの場合は "IME_Candidate_Window" と等しい UIA_AutomationIdPropertyId 、予測候補のリストの場合は "IME_Prediction_Window" である必要があります。
- 候補リストが表示され、消えると、それぞれ UIA_MenuOpenedEventId 型と UIA_MenuClosedEventIdのイベントが発生します。
- 現在選択されている候補が変更されると、候補リストで UIA_SelectionItem_ElementSelectedEventIdが発生します。 選択した要素には、TRUEと等しいプロパティUIA_SelectionItemIsSelectedPropertyId必要があります。
- 候補リストの各項目の UIA_NamePropertyId は、候補の名前である必要があります。 必要に応じて、 UIA_HelpTextPropertyIdを通じて候補者のあいまいさを解消するための追加情報を提供できます。
関連トピック
Windows developer