Windows 10 Creators Update 以降の OS で日本語 Microsoft IME を使用中にメモリ アクセス違反が発生することがある

こんにちは、Platform SDK (Windows SDK) サポートチームです。

今回は、日本語の Microsoft IME 使用中にメモリ アクセス違反が発生する現象についてご案内します。

 

現象

Windows 10 Creators Update 以降で、日本語 Microsoft IME を使用中に、大量のキー入力を高速で行うと、メモリ アクセス違反が発生することがあります。

 

詳細

テキスト ボックス等の入力可能なコントロールで WM_IME_COMPOSITION メッセージを処理すると、コントロール上で入力された変換文字列を操作することが可能です。

例えば、テキスト ボックスで WM_IME_COMPOSITION メッセージを受信した際に、引数に NI_COMPOSITIONSTR および CPS_COMPLETE を指定して ImmNotifyIME() を呼び出すプログラムを作成すると、ユーザーによって入力された変換文字列を即座に確定させることができます。

ひらがなのみ、カタカナのみを入力として受け付けたいテキスト ボックス等がある場合は、このようなプログラムを作成することによって、ユーザーの入力支援を行うことができます。

ところが、このような処理を行うプログラムを Windows 10 Creators Update 以降で実行して、大量のキー入力を連続して高速で行った (同じキーを押し続ける等) 場合に、メモリ アクセス違反が発生してプログラムが強制終了することがあります。

 

原因

Microsoft IME 側の予測変換処理とアプリケーション側の変換処理が並行して高速で実行されたために、文字変換処理に必要な内部データに不整合が生じた結果、メモリ アクセス違反が発生していました。

 

回避策

以下のいずれかの方法を、代替案としてご検討ください。

 

(a) Microsoft IME の予測変換を使用しない

 

(b) WM_IME_COMPOSITION メッセージではなく、WM_KEYDOWN メッセージを利用してユーザーが入力したキーを検出し、検出したキーの内容を元に独自で入力文字をテキスト ボックス等に表示する

ユーザーが [s][h][a] の順にキー入力を行った場合の例としては以下になります。

1. ユーザーが [s] キーを入力 => テキスト ボックスに 's' と表示

2. ユーザーが [h] キーを入力 => テキスト ボックスに "sh" と表示

3. ユーザーが [a] キーを入力 => テキスト ボックスから "sh" 部分を削除してから "しゃ" と表示

TITLE: WM_KEYDOWN メッセージ
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms646280.aspx

 

(c) 予測変換候補が表示されるまでの文字数を「3」に変更する

予測変換候補を表示するまでの既定の文字数は、Windows 10 Anniversary Update までは「3 文字」でしたが、Windows 10 Creators Update では「1 文字」に設定されています。
そこで、以下の手順で Windows 10 Anniversary Update までの「3 文字」またはそれ以上の文字数に設定します。

1. タスク バー上の IME の「A」か「あ」を右クリックし、プロパティを選択します。

2. 詳細設定 → 「予測入力」タブ → 「予測候補を表示するまでの文字数」の値を「3」またはそれ以上の値 (1 から 15 までの値を設定可能です) に変更して、OK をクリックします。

 

 

状況

本事象について情報が確認できましたら、本ブログを更新します。

 

更新履歴

2018.01.05 : 回避策に (c) を追加しました。