Bug 6445 [Win] ATOKでIMEをオンにした直後に文字を入力しようとすると文字がIMEを通さずにダイレクトに入力されることがある
初回投稿日時: 2010-06-02 13:38:25
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
個人的には、悲願だったこのバグ修正にようやく成功しました。
ATOKを半角/全角キーのみでオンにしようとすると、
WM_KEYUPVK_OEM_AUTOWM_KEYDOWNVK_PROCESSKEYWM_IME_NOTIFYIMN_PRIVATEWM_IME_NOTIFYIMN_PRIVATEWM_IME_NOTIFYIMN_PRIVATEWM_IME_NOTIFYIMN_SETOPENSTATUSWM_KEYDOWNVK_PROCESSKEY...WM_IME_STARTCOMPOSITION
というメッセージの順序で通常は処理されます。ところが、ATOKの起動がディスクスワップ等で遅れると、次に入力したキーが割り込んできて以下のようになります。
WM_KEYUPVK_OEM_AUTOWM_KEYDOWNVK_PROCESSKEYWM_IME_NOTIFYIMN_PRIVATEWM_KEYDOWNVK_AWM_CHAR'a'WM_KEYUPVK_AWM_IME_NOTIFYIMN_PRIVATEWM_IME_NOTIFYIMN_PRIVATEWM_IME_NOTIFYIMN_SETOPENSTATUS
ところが、この現象は普通のアプリでは一切再現しません。Geckoは入力のレスポンス速度を上げるために、キー、IME、マウスのメッセージを優先的に処理しようとするように、メッセージの取得部分が最適化されています。これを無効化すると再現しなくなったので、対応策をずっと考えていました。
つい最近、別のバグで検証している時に初めてVK_PROCESSKEYの存在を知ったのが突破口になりました。IMEを通した入力があった場合、IMEが処理済みのWM_KEYDOWNメッセージにはキーコードにこれが設定されています。つまり、このメッセージが来た場合、通常ならIMEはオンのはずです。しかし、このバグはIMEがオフの間にキーイベントが取り出されるのが問題だったわけです。実際に検証してみると、VK_PROCESSKEYのメッセージが来たときはまだ、ImmGetOpenStatus()はFALSEを返してきました。
このことから、VK_PROCESSKEYのWM_KEYDOWNを処理する時にIMEがオフのままならATOKの開き始めであると仮定し、WM_IME_NOTIFYでIMN_SETOPENSTATUSが来るまでの間、最適化を一時的に中断するようにしました。
ただ、他のIMEがオフの時にVK_PROCESSKEYを送信してこないとも限らないので、想定してないメッセージを受け取った時には最適化処理を再開するようにしています(ここがやや甘い感じもありますので、ご意見があればbugzilla-jpにでもよろしくお願いします)。
この修正により、メモリが少ない環境や、HDDが遅い環境(私の場合、こちらで、なんとHDDの回転数が4200rpm!)のATOKユーザはかなり快適になると思います。