Каков правильный современный способ обработки произвольного ввода текста в пользовательском элементе управления в Windows? WM_CHAR? IMM? TSF?

Я хочу иметь возможность поддерживать ввод текста в пользовательском элементе управления Windows, точно так же, как уже сделали EDIT и элементы управления rich edit, но не разделять их на подклассы. Элемент управления в настоящее время использует Direct2D и DirectWrite для рисования текста и работает в Windows Vista с пакетом обновления 1 (SP1) с обновлением платформы или более поздней версии (я мог бы изменить его на Windows 7 с пакетом обновления 1 (SP1) с обновлением платформы или более поздней версии, если решу, что мне нужны более новые функции Direct2D и DirectWrite, если они доступно там или только на Windows 8, но это другой вопрос ...)

Для чего это стоит, на OS X я бы использовалNSTextInputClient а на GTK + я бы использовалGtkIMContext, Это такие вещи, о которых я говорю.

Очевидный выбор - использоватьWM_CHAR, который, если я правильно понял, изначально UTF-16, если класс окна зарегистрирован сRegisterClassW()и поэтому должен «просто работать» независимо от местоположения. Тем не мение,WM_CHAR генерируетсяTranslateMessage(), а такжеего документация говорит, что нет способа определить, является лиWM_CHAR был создан или нет, так какTranslateMessage() всегда возвращает ненулевое значение. Мне нужно иметь возможность определить, будет ли текущее сообщение клавиатуры обрабатываться текстовой системой (и, следовательно, должно игнорироваться); это особенно верно, поскольку все нетекстовые ключи должны обрабатываться независимо от макета (что у меня уже есть).

Я также видел в примерах кода Windows 7 для API IMM и Text Services Framework. Я не уверен, что один лучше другого, и они оба, кажется, делают то же самое. Они?

В случае с IMM существует рядWM_IMM_xxx сообщения, которые я не уверен, должен ли я игнорировать или нет, и каждая найденная мной ссылка, кажется, не согласна с тем, должен ли я обрабатывать их в окне Unicode или нет ... Кроме того, вышеупомянутая проблема с определением, является ли данное ключевое событие будет обработано IMM или еще не открыто; есть ли способ?

У TSF есть концепция, называемая ACP, которая, кажется, позволяет мне использовать любой формат хранения текста, который я хочу для хранения текста, который я собираюсь использовать (т. Е. Не в процессе разработки). Это правда? Я хотел бы иметь возможность хранить свой текст как UTF-8 с атрибутами, преобразовывая в UTF-16 при рисовании (для DirectWrite). Позволяют ли мне делать другие варианты API?

Или я совершенно не на том пути?

И как бы явыбирать в на экранной клавиатуре когда я все это сделаю?

Другие ссылки, которые я использовал:

http://www.catch22.net/tuts/unicode-text-editing

Благодарю.

ОБНОВИТЬ 7 ноября 2016
Посмотрев на образец TsfPad снова, я заметил, что он также, кажется, просто используетWM_CHAR; теперь я не уверен, как он вообще использует TSF, кроме того, что он делает ...