У меня есть элемент управления ATL, который я хочу поддерживать в Unicode. Я добавил обработчик сообщений для WM_UNICHAR:
MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )
Но почему-то никогда не вызывается обработчик OnUniChar.
Согласно документации, обработчик сначала должен быть вызван с «UNICODE_NOCHAR», при этом обработчик должен вернуть TRUE, если вы хотите получить символы UTF-32. Но, как я уже сказал, обработчик никогда не вызывается.
Есть ли что-то особенное, что нужно сделать, чтобы активировать это?





Что вы делаете, что, по вашему мнению, должно генерировать сообщение WM_UNICHAR?
Если ваш код (или код ATL) в конечном итоге вызывает CreateWindowW, то ваше окно уже поддерживает Unicode, а сообщения WM_CHAR будут иметь формат UTF-16.
В документации далеко не ясно, когда именно создается сообщение WM_UNICHAR, но из того, что я могу собрать в очень ограниченном поиске в группах Google и в Интернете, похоже, что оно отправляется сторонними приложениями, а не самой Windows , если Window не является окном ANSI (CreateWindowA и все такое). Вы пытались вручную отправить сообщение WM_UNICHAR в свое окно, чтобы посмотреть, что произойдет? Если вы получили сообщение, значит, с вашим кодом отправки сообщения все в порядке, и ничего не происходит, что могло бы вызвать WM_UNICHAR. Вы также можете проверить с помощью Spy ++ и посмотреть, получаете ли вы это сообщение, хотя я подозреваю, что оно просто не отправляется.
Мое приложение скомпилировано с многобайтовым набором символов. Использование набора символов Unicode не вариант. Согласно документации, сообщение должно создаваться автоматически, если я чего-то не понимаю ...
Наконец, вы совершенно правы. Сообщение WM_UNICHAR изначально не отправляется Windows, а только сторонними приложениями. Благодарю за разъяснение.
Мой сегодняшний опыт показывает, что Spy ++ не дает правильных результатов для WM_CHAR в процессе Unicode. Я получаю переводы ASCII или "?" отображается в списке сообщений, даже если я просматриваю необработанные (не декодированные) аргументы. Отладчик показывает, что wParam - это кодовая точка Unicode.
void CMFCProView::OnUniChar (UINT xChar, UINT nRepCnt, UINT nFlags)
void CMFCProView::OnChar (UINT xChar, UINT nRepCnt, UINT nFlags)
Диапазон UINT (целое число без знака) составляет от 0 до 4294967295 десятичных чисел (16 бит).
OnChar может делать все, что вы хотите, OnUniChar. Щелкните английский
символ A на программной клавиатуре, то OnChar получит 0x0041.
Щелкните CJKV 一 (один), тогда OnChar получит 0x4E00. Так что мы не
нужен OnUniChar в приложении.
Извините.' 0x0041 и 0x0061
Ваш ответ может выиграть от форматирования кода или выделения кода.
4294967295 - максимальное 32-битное значение, а не 16-битное
Да 4294967295 (32-бит) = 65536 (16-бит) x 65536 (16-бит) -1. Спасибо Райан