当我们用IME键入WPF TextBox时是否可以获取WM_IME_ *消息?

时间:2011-09-28 17:19:04

标签: wpf ime

首先,感谢您阅读此主题并提供您的建议。

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

我们尝试了几种方法: 首先,WPF本机方法,如OnPreviewKeyDown(),OnTextInput()。缺少该解决方案的一个原因是我们无法获取Win32消息。我发现WPF不会回复某些特殊密钥,例如空格键不会导致调用OnTextInput()。 第二,不同的钩子,如SetWindowLong(),HwndSource.AddHook()。这些解决方案也不会获得WM_IME_ *消息。 第三,使用InputMethod类。我尝试使用InputMethod.ImeConversionMode来确定用户输入是否对应于WM_IME_ *消息。但是你知道它与ComponentDispatcher.ThreadFilterMessage有不同的方式,并且与几个基本定律不同。与此同时,我不确定这两种方式是否存在重叠的情况,以及是否有错过的情况。有这么多语言和很多种输入法,每种都有不同的字符集和标点符号(它们可以单独组合),那么这个解决方案就有风险了。

当我正在调查可以通过TextBoxBase.OnGotKeyboardFocus()创建的类ImmComposition时,我已经看到钩子ImmCompositionFilterMessage()正在处理WM_IME_CHAR(0x0286),但未能在我的钩子中添加它基础。 OnGotKeyboardFocus():

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

        InstallHook();
    }
}

0 个答案:

没有答案