Advanced / W-ZERO3 [es]でAzukiのサンプルであるAnnを動かしていたところ、なにやら怪しい挙動が出てきました。Ctrl+BackSpaceで単語単位で削除を行おうとしたところ複数の単語が削除され、最後に入力した日本語が再入力されるという意味不明な動作です。
本日、これはAzukiのバグだろうと勘違いして解析していたのですが、結論としてはバグではなく「ATOKを無効化する」ことで現象が発生しなくなることが分かりました。Windows Mobileが悪いのかATOKが悪いのかは分からず釈然としないのですが、とりあえず「現象は起こる」、「Azuki側で対策できない」、ということでこの問題は放置することにします。以下に詳細を記します。
ATOKはWindows Mobile版でもCtrl+BackSpaceを押すことで「確定UNDO」が実行できます。この機能は最後に確定した日本語入力をやりなおす、というものです。具体的には次のような動作が実行されます。
「最後に確定した日本語文字数だけBackSpaceで消した後、最後に確定した日本語の読みを再入力する」
この動作の前半に問題が起こっていました。ATOKから最後に確定した文字数だけの「BackSpace」が送信されてこなくてはならないところ、Windows Mobile環境では「Ctrl+BackSpace」が送信されてきていたのです。詳しく書くと、通常のWindows環境では確定UNDO実行直後に次のようにメッセージが送信されてきます。
- WM_KEYDOWN (Ctrlキー)
- WM_KEYDOWN (Ctrl+IMEプロセスキー) # 詳細割愛
- WM_KEYDOWN (BackSpaceキー)
- WM_KEYDOWN (BackSpaceキー)
- …
ところが、Windows Mobileでは次のようなメッセージが送信されてきます。
- WM_KEYDOWN (IMEプロセスキー) # 詳細割愛
- WM_KEYDOWN (Ctrlキー)
- WM_KEYDOWN (Ctrl+BackSpaceキー)
- WM_KEYDOWN (Ctrl+BackSpaceキー)
- …
実際のところWindows MobileとATOKのどちらが悪いのかは分かりませんが、このようなメッセージが送信されてくる以上、Azuki側では対処のしようがありません。困ったものですが、放置するしかないので放置します。
ところで、ATOKの確定UNDOの実装には無理がありますね。どこに無理があるかというと、様々な前提を置かなくては成り立たない「操作のエミュレーション(キーボードマクロのような)」で実現しているからです。とりあえず私が使っているATOK 2009では日本語入力を確定した直後にマウスクリックでカーソルを移動してから確定UNDOを実行すると、おかしな動作をします。OKなパターンで実行する方針ではなく、ダメなパターンに対策する方針なので漏れが無くなるまで際限なく対策を繰り返す必要があると思うので、こういう実装はあまり良くないですよね…これしかなかったのだとは思いますが。