掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Window10でTEditorコンポーネントのキャレットが消える問題への対応 (ID:149673)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
あれからメッセージの流れを詳細に確認し、以下のような別解も考えましたので、参考までにご報告いたします。 IMN_CLOSECANDIDATEが飛んでこないなら、必要な時に自分で飛ばしてしまえという発想です。新しいIMEで、 IMN_OpenCandidateが連続、重複して発生しないよう、 ①既にIMN_OpenCandidateが発生していて、 ②まだIMN_CloseCandidateが発生していない という場合には、FImeWindowShowingなる変数により重複判定も行うようにしました。 ただ、今更なのですが、MSDNでのやり取りも少し見かけたのですが、IMN_CloseCandidateがドキュメントどおり に飛んでこないというのは、どちらかというとバグに近い現象のように感じました。今回の手法では、 IMN_CloseCandidateが飛んできても来なくても問題なく処理できるようにしたものの、Windowsのバグに合わせて 自分のプログラムを作りこむというのはまた違う話のように思えました。 まだIMEは新しくなってそれほど期間がたっておらず、修正される可能性もあることから、当面は「以前のIMEを使う」 オプションで回避するのも手なのかな、という気がしてきました。(今どちらにするか悩んでいます。) ただ、自分の稚拙な知識で考えた解決策であっても、どなたかのお役に立てるかもしれないな、という気もしましたの で、感謝の気持ちも込め、ひとまず投稿させていただきます。 procedure TEditor.WMImeComposition(var Msg: TMessage); var Imc: HIMC; L: Integer; S: String; begin inherited; if (Msg.LParam and GCS_RESULTSTR <> 0) then begin if not FReadOnly then begin Imc := ImmGetContext(Handle); L := ImmGetCompositionString(Imc, GCS_RESULTSTR, nil, 0); SetLength(S, L + 1); ImmGetCompositionString(Imc, GCS_RESULTSTR, PChar(S), L + 1); ImmReleaseContext(Handle, Imc); SetLength(S, L); FImeCount := L; PutStringToLine(S); // MDMain.Memo1.Lines.Add(S); // メッセージの流れを可視化したい場合のデバッグ用 end; SendMessage(Handle, WM_IME_NOTIFY, IMN_CLOSECANDIDATE, 0); // 文字入力が完了したらメッセージを飛ばす。 end else if Msg.LParam = 0 then begin SendMessage(Handle, WM_IME_NOTIFY, IMN_CLOSECANDIDATE, 0); // 変換がキャンセルされてもメッセージを飛ばす。 end; end; procedure TEditor.WMImeNotify(var Msg: TMessage); begin inherited; // FImeWindowShowingは自分で追加した新しい変数。TEditorのconstructor内でFalseに初期化しておく。 if Msg.WParam = IMN_OPENCANDIDATE then begin if not FImeWindowShowing then begin // IMEの処理がまだ始まっていない場合に限り、1回だけ処理 CaretBeginUpdate; FImeWindowShowing := True; MDMain.Memo1.Lines.Add('WM_Ime_Notify (IMN_OpenCANDIDATE)'); // メッセージの流れを可視化したい場合のデバッグ用 end; end else if Msg.WParam = IMN_CLOSECANDIDATE then begin if FImeWindowShowing then begin CaretEndUpdate; FImeWindowShowing := False; MDMain.Memo1.Lines.Add('WM_Ime_Notify (IMN_CloseCANDIDATE)'); // メッセージの流れを可視化したい場合のデバッグ用 end; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.