当我们使用IME在WPF文本框中键入时,是否可以获取WM_IME_*消息?

当我们使用IME在WPF文本框中键入时,是否可以获取WM_IME_*消息?,wpf,ime,Wpf,Ime,首先,感谢您阅读本文并提供您的建议 下面是我问题的详细描述:由于遗留代码的规模很大,我们需要使用Win32消息。对于UI部分,我们需要使用WPF来使我们的外观现代化。UI的这一部分需要将键盘消息定向到旧的遗留组件中。对于没有输入法的输入消息,我们使用ComponentDispatcher.ThreadFilterMessage来获取这些消息,如WM_KEYDOWN、WM_CHAR等。但是对于IME输入,我们无法获得相应的WM_IME_*消息。我们是否有办法获取这些消息,或者至少获取与WM_IME

首先,感谢您阅读本文并提供您的建议

下面是我问题的详细描述:由于遗留代码的规模很大,我们需要使用Win32消息。对于UI部分,我们需要使用WPF来使我们的外观现代化。UI的这一部分需要将键盘消息定向到旧的遗留组件中。对于没有输入法的输入消息,我们使用ComponentDispatcher.ThreadFilterMessage来获取这些消息,如WM_KEYDOWN、WM_CHAR等。但是对于IME输入,我们无法获得相应的WM_IME_*消息。我们是否有办法获取这些消息,或者至少获取与WM_IME_*消息对应的所有输入文本

为此,我们尝试了几种方法: 首先,WPF本机方法(如OnPreviewKeyDown)是OnPut。该解决方案的一个缺点是我们无法获取Win32消息。我发现WPF不会对某些特殊的键做出响应,例如空格键不会导致调用ONTPUTE。 第二,不同的钩子,比如SetWindowLong、HwndSource.AddHook。这些解决方案也不会获得WM_IME_*消息。 第三,使用InputMethod类。我尝试使用InputMethod.ImeConversionMode来确定用户输入是否对应于WM_IME_*消息。但您知道,对于ComponentDispatcher.ThreadFilterMessage,这是一种不同的方式,而且违反了一些基本法则。同时,我不确定这两种方式是否有重叠的案例,是否有遗漏的案例。有这么多的语言和这么多的输入法,每种语言都有不同的字符集和标点符号,它们可以单独组合,这样的解决方案是有风险的

当我研究类ImmComposition时,它可以由TextBoxBase.OnGotKeyboardFocus创建,我看到hook ImmCompositionFilterMessage正在处理WM_IME_CHAR0x0286,但未能在我的hook中得到它,在base之后添加。OnGotKeyboardFocus:

public class HookedTextBox : TextBox
{
    protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        base.OnGotKeyboardFocus(e);

        InstallHook();
    }
}