Bug 6445 [Win] ATOKでIMEをオンにした直後に文字を入力しようとすると文字がIMEを通さずにダイレクトに入力されることがある
初回投稿日時: 2010年06月02日13時38分25秒
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
個人的には、悲願だったこのバグ修正にようやく成功しました。
ATOKを半角/全角キーのみでオンにしようとすると、
WM_KEYUP
VK_OEM_AUTO
WM_KEYDOWN
VK_PROCESSKEY
WM_IME_NOTIFY
IMN_PRIVATE
WM_IME_NOTIFY
IMN_PRIVATE
WM_IME_NOTIFY
IMN_PRIVATE
WM_IME_NOTIFY
IMN_SETOPENSTATUS
WM_KEYDOWN
VK_PROCESSKEY
...WM_IME_STARTCOMPOSITION
というメッセージの順序で通常は処理されます。ところが、ATOKの起動がディスクスワップ等で遅れると、次に入力したキーが割り込んできて以下のようになります。
WM_KEYUP
VK_OEM_AUTO
WM_KEYDOWN
VK_PROCESSKEY
WM_IME_NOTIFY
IMN_PRIVATE
WM_KEYDOWN
VK_A
WM_CHAR
'a'
WM_KEYUP
VK_A
WM_IME_NOTIFY
IMN_PRIVATE
WM_IME_NOTIFY
IMN_PRIVATE
WM_IME_NOTIFY
IMN_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ユーザはかなり快適になると思います。