Не допонял WM_UNICHAR

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Не допонял WM_UNICHAR

Re: Не допонял WM_UNICHAR

Сионист » 18 дек 2015, 15:24

Наглядно видно, что первая же ссылка непосредственно выдачи соответствует "возможно вы имели ввиду":Изображение

Re: Не допонял WM_UNICHAR

Сионист » 17 дек 2015, 10:26

У меня часть символов набирается с реальной клавиатуры, а часть с окна, выполняющего роль экранно-виртуальной спецклавиатуры только для внутреннего употребления для нужд одного приложения с отсутствующими на основной клавиатуре символами вроде символа градуса и даже целыми словами. При нажатии слова посылается сразу серия сообщений. Так как эта клавиатура изначально предназначена для набора заковыристых символов, которых нет ни в кириллице, ни в латинице, а внутреннее представлении строк - std::u32string, то логично на WM_LBUTTONDOWN в пределах любой из этих кнопок отвечать отправкой именно WM_UNICHAR. Если же сообщение пришло с реальной клавиатуры, то для того, чтоб единобезобазить обработку символа и собрать её одно место, на WM_CHAR оконная процедура тоже отвечает отправкой самой себе WM_UNICHAR. Примитивнейшее решение.

Re: Не допонял WM_UNICHAR

Romeo » 17 дек 2015, 09:11

Сионист писал(а):Ага. А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить, а получилось только к третьему курсу именно потому, что он не добавляет ни какой новой информации, а от химического закона, да ещё с репутацией великого, с которого якобы началась химия, ожидается хоть какая то осмысленность. Также и эта фраза про возвращаемое значение.
Что за словоблудие... Держи как-то себя в руках и пиши по теме. Ты лучше бы прочитал объяснения, которые я дал после этого перевода, вместо того, чтобы флудить - в них эта фраза расшифрована.
Сионист писал(а):Оно же LRESULT. И вдруг true и false. Не понятно.
LRESULT - это дефайн для long, так же, как и BOOL. А TRUE и FALSE (заостряю внимание на том, что они написаны большими буквами, потому что ты их всё время маленькими пишешь) - это дефайны для 1 и 0 соответственно. Поэтому в возврате нет никаких проблем. И если бы ты внимательно прочитал мои объяснения, то всё бы понял с первого раза.
Сионист писал(а):Вопрос к Romeo. Ну как, добились получения сообщения WM_UNICHAR?
А я и не пробовал добиться. Мне это не интересно. Я лишь указал на статью.

Сионист » 17 дек 2015, 06:58

Ну как же? Ноль - специальный знак в позиционных системах счисления, заполняющий пропущенный разряд числа во избежание неопределённости в определении веса других разрядов. Ребёнку данную концепцию приходится объяснять, по дефолту она не известна. Или речь о числе ноль, а не цифре? Тоже просто: число ноль обозначает отсутствие величины как таковой, или предметов, количество которых равно этому числу. Опять таки не самая простая концепция. А "закон" о свойствах вещества - совсем другое. Если ребёнок уже усвоил атомистическую концепцию, знает, что такое молекула и ему известно слово "свойство", то этого уже достаточно, ничего нового этот "закон" не добавляет. Чем ещё должны определяться свойства вещества? Цветом пробирки, в которую оно налито? Не смешно.

Вопрос к Romeo. Ну как, добились получения сообщения WM_UNICHAR?

Re: Не допонял WM_UNICHAR

Absurd » 16 дек 2015, 19:36

А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить именно потому, что он не добавляет ни какой новой информации
А вот определение нуля можешь рассказать? Какую новую информацию оно дает?

Сионист » 16 дек 2015, 19:21

"Возвращаемое значение - это результат обработки сообщения и зависит от этого сообщения".
Ага. А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить, а получилось только к третьему курсу именно потому, что он не добавляет ни какой новой информации, а от химического закона, да ещё с репутацией великого, с которого якобы началась химия, ожидается хоть какая то осмысленность. Также и эта фраза про возвращаемое значение.
Конкретно в случае сообщения WM_UNICHAR, возвращаемое значение является типом BOOL и может состоять лишь из двух вариантов - TRUE или FALSE. Очень надеюсь, что эта часть понятна, так как понимание второго пункта зависит от понимания первого.
Оно же LRESULT. И вдруг true и false. Не понятно.
В ней вольный исследователь пишет, что не смог добиться от Windows чтобы она вообще присылала это сообщение и рекомендует завязываться не на WM_UNICHAR, а на WM_CHAR, убедившись, что окно было создано уникодным (использовалась CreateWindowW). Очень рекомендую принять эти данные к сведению.
Ну я то добился быстро, кстати, даже на винде врядли есть хоть что то ещё примитивней, даже само создание окна как такового и то сложней. Ключ к решению у Петзолдта:
Сообщения порождают сообщения.
.

Re: Не допонял WM_UNICHAR

Romeo » 16 дек 2015, 09:49

Ладно. Видимо придётся разжевать.

Заметь, я ни разу не слышал про это сообщение до того, как ты создал эту тему. Таким образом мы были с тобой в абсолютно равных условиях на старте. Однако по какой-то неизвестной причине, прочитав статью на 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). Очень рекомендую принять эти данные к сведению.

Напоследок хочу в очередной раз подчеркнуть, что для того, чтобы осознать всё вышесказанное не нужно быть семи пядей во лбу или потратить неделю на исследования. Достаточно просто здравого смысла и ключевых навыков по поиску в интернете нужной информации. Оба умения обязаны быть у каждого программиста, иначе он в принципе не имеет права себя считать программистом...

Сионист » 15 дек 2015, 18:52

Romeo писал(а):Вот, что написано о том, что возвращает WindowProc:

Ещё вопросы имеются?
И?????????????
Плохо читал. Там об этом есть.
Ровно 3 места:
The WM_UNICHAR message can be used by an application to post input to other windows. This message contains the character code of the key that was pressed. (Test whether a target app can process WM_UNICHAR messages by sending the message with wParam set to UNICODE_NOCHAR.)
,
If wParam is UNICODE_NOCHAR and the application processes this message, then return TRUE. The DefWindowProc function will return FALSE (the default).
и
If wParam is not UNICODE_NOCHAR, return FALSE. The Unicode DefWindowProc posts a WM_CHAR message with the same parameters and the ANSI DefWindowProc function posts either one or two WM_CHAR messages with the corresponding ANSI character(s).
. Больше UNICODE_NOCHAR не нашёл даже огнелис.

Re: Не допонял WM_UNICHAR

Romeo » 15 дек 2015, 17:38

Сионист писал(а):И где же там хоть слово про то, что такое UNICODE_NOCHAR?
Плохо читал. Там об этом есть.
Сионист писал(а):И про возврат только какие то непонятные true и false, а ведь оконная процедура возвращает не bool.
Вот, что написано о том, что возвращает WindowProc:
Return value

Type:
Type: LRESULT

The return value is the result of the message processing and depends on the message sent.

Ещё вопросы имеются?

Re: Не допонял WM_UNICHAR

Сионист » 15 дек 2015, 15:56

И где же там хоть слово про то, что такое UNICODE_NOCHAR? И про возврат только какие то непонятные true и false, а ведь оконная процедура возвращает не bool.

Вернуться к началу