えっと挙動を見ながら原因を推測しました。
問題にしたいのは、ATOKは本来WM_IME_COMPOSITION を握りつぶすと一瞬変換ウィンドウを閉じて再度開く挙動を
見せるはずなのですが、FF11は開きっぱなしになります。
このあたりを推測するに、WM_IME_COMPOSITIONの後、WM_CHARを発生させないためにIMEのコンテキストを
消去するルーチンが入っているかと思われます。
単純に消去しようとすると、
ImmNotifyIME( hImc, NI_COMPOSITIONSTR,CPS_CANCEL,0);
の形でIMM32のAPIをコールすることになるかとおもいますが、これをWM_IME_COMPOSITONのウィンドウメッセージを処理中にすると、すでに入力している未確定の頭の文字ごと消えます。Vista以降でおきているのは多分これかと思います。
(ちなみに、ラインエディタ上で日本語入力onにした後、宅配のキャラクタ名入力時も頭の一文字が抜けます)
WM_IME_COMPOSITION を処理中に、IME上の文字列を消去しようとすると、
ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING, TEXT(""), sizeof(TCHAR), TEXT(""), sizeof(TCHAR));
と呼び出す(IME上に入力確定後、次の一文字を未確定状態に戻した上に、変換ウィンドウを消さないのはおそらくこのAPIをコールしていると推定します)
問題は、このAPIを使用して、IME上の文字を消去して未確定状態に戻すためには、以下の書き方があります。
イ) ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING, NULL,0,NULL,0);
ロ) ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING, NULL,0,TEXT(""),0);
ハ) ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING, TEXT(""), sizeof(TCHAR), NULL ,0);
ニ) ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING, TEXT(""), sizeof(TCHAR), TEXT(""), sizeof(TCHAR));
イは、呼び出し上問題外なのですが、XP以前では動いちゃいます。
ロは、XPより前は可能な書き方でしたが、VISTA以降は非互換性があります。
ハ、ニの書き方はどちらもVISTA以降でも動きます。マイクロソフトのIMM32互換性情報.doc 上ご確認ください。
(問題1)
もうひとつ問題があって、このAPI (IMEが再変換を実装してない場合がある)ので失敗する環境があること(問題2)
で、おそらく、
if( ImmSetCompositionString(hImc, SCS_SETRECONVERTSTRING,NULL,0,TEXT(""),sizeof(TCHAR)) == 0 ){
ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_COMPLETE , 0);
}
のようなコードがウィンドウプロシージャの中に紛れ込んでいるのではないでしょうか?
この場合XP以前とVISTA以降のATOK は所望の動作をしてくれます。再変換を実装していないIMEと、VISTA以降は、ImmSetCompositionStringは失敗して、ImmNotifyIMEを呼び出します。
以上、FF11の挙動を見て推測しました。何かの参考になられたら幸いです。

Reply With Quote