まず、このスレッドを読んでいただき、ご提案をお寄せいただきありがとうございます。
私の質問の詳細な説明は次のとおりです。大規模なレガシー コードのため、Win32 メッセージを使用する必要があります。また、UI 部分については、WPF を使用して外観を最新化する必要があります。UI のその部分は、キーボード メッセージを古いレガシ コンポーネントに送信する必要があります。IME を使用しない入力メッセージの場合、ComponentDispatcher.ThreadFilterMessage を使用して、WM_KEYDOWN、WM_CHAR などのメッセージを取得しました。しかし、IME 入力の場合、対応する WM_IME_* メッセージを取得できません。これらのメッセージを取得する方法、または少なくとも WM_IME_* メッセージに対応するすべての入力テキストを取得する方法はありますか?
そのためにいくつかの方法を試しました。まず、OnPreviewKeyDown()、OnTextInput() などの WPF ネイティブ メソッドです。この解決策の欠点の 1 つは、Win32 メッセージを取得できないことです。また、WPF がいくつかの特別なキーに応答しないことがわかりました。たとえば、Space キーでは OnTextInput() が呼び出されません。2 つ目は、SetWindowLong()、HwndSource.AddHook() などのさまざまなフックです。これらのソリューションは、WM_IME_* メッセージも取得しません。第三に、InputMethod クラスを使用します。InputMethod.ImeConversionMode を使用して、ユーザー入力が WM_IME_* メッセージに対応するかどうかを判断しようとしました。しかし、ComponentDispatcher.ThreadFilterMessage では別の方法であり、いくつかの基本法則に反していることはご存知でしょう。同時に、これら 2 つの方法で重複するケースがあるかどうか、および見逃されているケースがあるかどうかはわかりません。
TextBoxBase.OnGotKeyboardFocus() で作成できるクラス ImmComposition を調査しているときに、フック ImmCompositionFilterMessage() が WM_IME_CHAR(0x0286) を処理しているのを見ましたが、ベースの後に追加されたフックでそれを取得できませんでした。OnGotKeyboardFocus():
public class HookedTextBox : TextBox
{
protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
base.OnGotKeyboardFocus(e);
InstallHook();
}
}