Почему мой обработчик WM_UNICHAR никогда не вызывается? - PullRequest
2 голосов
/ 18 декабря 2008

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

MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )

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

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

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

Ответы [ 3 ]

5 голосов
/ 18 декабря 2008

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

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

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

0 голосов
/ 05 октября 2016
void CMFCProView::OnUniChar (UINT xChar, UINT nRepCnt, UINT nFlags)
void CMFCProView::OnChar    (UINT xChar, UINT nRepCnt, UINT nFlags)

Диапазон значений UINT (unsigned int) составляет от 0 до 4294967295 десятичных (16-бит).

OnChar может делать все, что вы хотите, чтобы OnUniChar делал. Нажмите на английский символ A на программной клавиатуре, тогда OnChar получит 0x0041. Нажмите CJKV 一 (один), тогда OnChar получит 0x4E00. Так что мы не Нужен OnUniChar в приложении.

0 голосов
/ 30 августа 2012

Мой опыт показывает, что Spy ++ не дает правильных результатов для WM_CHAR в процедуре Unicode. Я получаю переводы ASCII или '?' отображается в списке сообщений, даже если я просматриваю необработанные (не декодированные) аргументы. Отладчик показывает, что wParam является кодовой точкой Unicode.

...