Ладно. Видимо придётся разжевать.
Заметь, я ни разу не слышал про это сообщение до того, как ты создал эту тему. Таким образом мы были с тобой в абсолютно равных условиях на старте. Однако по какой-то неизвестной причине, прочитав статью на MSDN, я всё понял, а ты не понял ничего. Выводы делай сам...
Пункт №1. Что возвращает WindowProc? Оконная процедура возвращает LRESULT, и в документации (выжимку из которой я вставлял выше) написано, что (перевожу) "Возвращаемое значение - это результат обработки сообщения и
зависит от этого сообщения". То есть, разные сообщения могут возвращать разные по смыслу значения и операционная система, зная какое сообщение она передала в WindowProc, будет правильным образом реагировать на них. Конкретно в случае сообщения WM_UNICHAR, возвращаемое значение является типом BOOL и может состоять лишь из двух вариантов - TRUE или FALSE. Очень надеюсь, что эта часть понятна, так как понимание второго пункта зависит от понимания первого.
Пункт №2. Как же правильно обрабатывать сообщение WM_UNICHAR и что такое UNICODE_NOCHAR? Дело в том, что операционная система на каждый нажатый уникодный символ генерирует два сообщения WM_UNICHAR. В первом она как бы спрашивает, хочет ли приложение обрабатывать уникодный символ, а во втором собственно присылает этот уникодный символ (если первый раз WindowProc отреагировала утвердительно). Если бы тебе нужно было реализовать такую функциональность, ты бы как это сделал? По-моему выход один и он очевиден - передавать специальный флажок, чтобы различать эти два вызова. Так мы приходим к ответу на вопрос, что такое UNICODE_NOCHAR. Это просто флажок. Если он взведён, значит ОС не прислала нам ещё символа (отсюда название дефайна), а просто спрашивает нас, хотим ли мы обработать уникодный символ. Если мы возвращаем FALSE (точно так же как это делает DefWindowProc), тогда второе сообщение WM_UNICHAR даже не будет сгенерировано. Если же мы вернули TRUE, значит ОС сгенерирует второй раз сообщение WM_UNICHAR, но на этот раз уже без флажка UNICODE_NOCHAR. Вместо флажка wParam будет содержать сам уникодный символ. После его обработки мы обязаны вернуть FALSE (это тоже указано в статье).
Помимо того, что я прочитал указанную выше коротенькую документашку на MSDN, я ещё погуглил, что интересного пишут в интернетах об этом сообщении. Набрёл на вот такую достаточно занятную
статью. В ней вольный исследователь пишет, что не смог добиться от Windows чтобы она вообще присылала это сообщение и рекомендует завязываться не на WM_UNICHAR, а на WM_CHAR, убедившись, что окно было создано уникодным (использовалась CreateWindowW). Очень рекомендую принять эти данные к сведению.
Напоследок хочу в очередной раз подчеркнуть, что для того, чтобы осознать всё вышесказанное не нужно быть семи пядей во лбу или потратить неделю на исследования. Достаточно просто здравого смысла и ключевых навыков по поиску в интернете нужной информации. Оба умения
обязаны быть у каждого программиста, иначе он в принципе не имеет права себя считать программистом...