.NET2.0 で、IMEが勝手に無効になってしまったりという現象がおきている。
どうやら、.NET2.0での仕様変更と、(それに伴う?)バグが元になっているようだ。
問題点
現象は2つの問題に分けて考えることができる。
- (A)一部のコントロールではIMEが強制的にOFFになる。
- (B)IMEが有効なTextBox等のコントロールでIMEを状態が保存されない。
- 具体的には、(B)のコントロールでIMEをONにしてから、(A)のコントロールにフォーカスが遷移し、その後再び(B)のコントロールに遷移すると、IMEがOFFのままとなる。
このうち(A)は.NET2.0からの仕様変更であり、「そもそもキー入力を受け付けるべきではない」
コントロールと、「入力を受け付ける」コントロールに分かれたようだ。
対策
(A)は、「入力を受け付ける」コントロールを全面に貼る、他のコントロールから継承する等により回避可能。
(B)は、おそらく.NET2.0のバグであり、パッチが当たるまでは対処方法はなさそうだ。
Microsoftの発言
以下に、それぞれの問題に関するフォーラムでのMicrosoftの発言を引用する。
但し、これらの発言はOfficialなものでは無い為何ら保証は無いことに注意。
(A)について
引用元:http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=264330&SiteID=7
これは仕様変更によるものです。2.0 ではキー入力を持つコントロールとキー入力を持たないコントロールに分け、キー入力を持たないコントロールでは、IME が機能しないように変更いたしました。
キー入力を持たないと言っても、実際にはIMEを通さないキーイベントは挙がります。正確には、言葉として意味のある文字列を入力することを期待するコントロールと、ショートカット等のウィンドウをコントロールするためのキー入力のみを受け付けるコントロールと表現すべきでしょうか。
この変更は、ユーザーからの要望に基づいて行われたものですが、IMEをオフにすることなくショートカットが使用できるようにするためです。また、不必要なIMEウィンドウの表示を抑制するためでもあります。
一方、ご指摘のように、通常は入力を持たないようなコントロール上でもキー入力を受け付けたいというシナリオは確かにあると思います。しかし、単にIMEが機能すればそれで良いという場合は少なく、通常はフローティングのIMEウィンドウを出すことなく、描画も含めて自分自身でコントロールする場合が殆どです。そうするためには、単純にIMEが使える使えないではなく、どうしても、IME(IMM)関連のメッセージに応じたり、メソッドを呼び出す必要が出てきます。残念ながら現状ではこれらの対応を行うためには低レベルなメソッドを呼び出す必要があります。
このようなことを総合的に検討した結果、仕様変更させていただきました。この変更により作業が発生してしまう方には大変申し訳ありませんが、何卒ご理解のほどよろしくお願いいたします。
キー入力を受け付ける場合は、Contorl や TextBox (BorderStyle=None, BackColor=Control, Multiline=true)等を全面に貼り付けて使用してください。
この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。
(B)について
引用元:http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=260981&SiteID=7
ImeMode が Hiragana に設定されているテキストボックスにフォーカスがある時、MessageBox.Show でメッセージボックスを表示すると、
テキストボックスの ImeMode プロパティの設定値が Off に変わります。
(以下問題点報告が続く)
ご報告ありがとうございます。
問題を確認いたしました。サービスパックもしくは次期バージョンにて修正することを検討いたします。
ありがとうございました。
この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。