Во-первых, спасибо, что прочитали эту ветку и предоставили свое предложение.
Вот подробное описание моего вопроса: из-за большого объема устаревшего кода нам необходимо использовать сообщения Win32.А для пользовательского интерфейса нам нужно использовать WPF для модернизации нашего внешнего вида.Эта часть пользовательского интерфейса должна направлять сообщения клавиатуры в старый устаревший компонент.Для входных сообщений без 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 и противоречит нескольким основным законам.В то же время я не уверен, могут ли случаи перекрываться для этих двух способов, и есть ли пропущенные случаи.Существует так много языков и так много видов методов ввода, каждый из которых имеет свой набор символов и знаки препинания (их можно комбинировать по отдельности), тогда это решение будет рискованным.
Когда я исследую сКласс ImmComposition, который может быть создан с помощью TextBoxBase.OnGotKeyboardFocus (), я видел, что хук ImmCompositionFilterMessage () имеет дело с WM_IME_CHAR (0x0286), но не удалось получить его в моем хуке, добавленном после базы.OnGotKeyboardFocus ():
public class HookedTextBox : TextBox
{
protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
base.OnGotKeyboardFocus(e);
InstallHook();
}
}