Почему мой обработчик WM_UNICHAR никогда не вызывается?

У меня есть элемент управления ATL, который я хочу поддерживать в Unicode. Я добавил обработчик сообщений для WM_UNICHAR:

MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )

Но почему-то никогда не вызывается обработчик OnUniChar.

Согласно документации, обработчик сначала должен быть вызван с «UNICODE_NOCHAR», при этом обработчик должен вернуть TRUE, если вы хотите получить символы UTF-32. Но, как я уже сказал, обработчик никогда не вызывается.

Есть ли что-то особенное, что нужно сделать, чтобы активировать это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
2 327
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что вы делаете, что, по вашему мнению, должно генерировать сообщение WM_UNICHAR?

Если ваш код (или код ATL) в конечном итоге вызывает CreateWindowW, то ваше окно уже поддерживает Unicode, а сообщения WM_CHAR будут иметь формат UTF-16.

В документации далеко не ясно, когда именно создается сообщение WM_UNICHAR, но из того, что я могу собрать в очень ограниченном поиске в группах Google и в Интернете, похоже, что оно отправляется сторонними приложениями, а не самой Windows , если Window не является окном ANSI (CreateWindowA и все такое). Вы пытались вручную отправить сообщение WM_UNICHAR в свое окно, чтобы посмотреть, что произойдет? Если вы получили сообщение, значит, с вашим кодом отправки сообщения все в порядке, и ничего не происходит, что могло бы вызвать WM_UNICHAR. Вы также можете проверить с помощью Spy ++ и посмотреть, получаете ли вы это сообщение, хотя я подозреваю, что оно просто не отправляется.

Мое приложение скомпилировано с многобайтовым набором символов. Использование набора символов Unicode не вариант. Согласно документации, сообщение должно создаваться автоматически, если я чего-то не понимаю ...

Martin Cote 19.12.2008 00:59

Наконец, вы совершенно правы. Сообщение WM_UNICHAR изначально не отправляется Windows, а только сторонними приложениями. Благодарю за разъяснение.

Martin Cote 19.12.2008 01:44

Мой сегодняшний опыт показывает, что 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

KW Tu 05.10.2016 19:59

Ваш ответ может выиграть от форматирования кода или выделения кода.

Mario Tacke 05.10.2016 20:23

4294967295 - максимальное 32-битное значение, а не 16-битное

Ryan Bemrose 05.10.2016 20:59

Да 4294967295 (32-бит) = 65536 (16-бит) x 65536 (16-бит) -1. Спасибо Райан

KW Tu 06.10.2016 02:31

Другие вопросы по теме