Необходимо разобраться с циклом сообщений которые передаются окну!

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 12 сен 2011.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Интересно, зачем майкрософт сделали так? что мешало генерить код символа вместе со сканкодом прямо в источнике сообщения WM_KEYDOWN и писать его в wParam?
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Dmitry_Milk
    Потому что WM_CHAR это лишь частный случай. Каждому своё - кому-то нужен код клавиши, кому-то печатаемый символ. Клавиши навигации, например. Для них не будет генерироваться WM_CHAR, только WM_KEYDOWN/WM_KEYUP.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Кроме символьных клавиш WM_CHAR генерится также и при наборе кода символа на цифровой клавиатуре при нажатой Alt. Выдается он при отжатии Alt и в никакой кей-даун его ес-но не всунешь
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да, я сёдня думал-думал и всё понял, ребята. Спасибо. Но возник опять вопрос. Значит, TranslateMessage на основе имеющегося сообщения
    WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, или WM_SYSKEYUP
    генерит новое WM_CHAR и ставит его в очередь. Но ведь это же непродуктивно! Гораздо эффективнее было бы, если бы TranslateMessage просто изменяла поля структуры msg, то есть до вызова TranslateMessage было

    C03D2- хэндл окна
    100- WM_KEYDOWN
    52- виртуалныый код клавиши "R" (я на неё нажал)
    130001 какой-то дополнительный параметр
    14EA985- время
    2E6- координаты курсора
    ___________________________________________

    И сразу же после вызова стало

    C03D2- хэндл окна
    102- WM_CHAR
    EA- ANSI код клавиши "R" (я на неё нажал)
    130001 какой-то дополнительный параметр
    1530A20- время
    275- координаты курсора

    После чего НЕ СЛЕДОВАЛО БЫ ничего ставить в очередь, а просто бы код работал бы своим чередом, то есть далее следовало бы
    Код (Text):
    1. DispatchMessage, ADDR msg
    с адресом структуры заполненной, как надо (WM_CHAR). Всё, вот хочу понять, почему TranslateMessage не реализована так, может, вы знаете. А, может, я ошибаюсь в оценке эффективности видимого мной способа.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    А может гораздо эффективнее было бы, если бы TranslateMessage вообще обнуляла все сообщения? Тогда и обрабатывать потом ничего не надо, и лишних проверок в TranslateMessage нету.

    Это я к тому, что с какой стати TranslateMessage должна уничтожать WM_KEYDOWN, заменяя его WM_CHAR? Оконная процедура ведь тогда WM_KEYDOWN не получит, а должна получить, как WM_KEYDOWN, так и WM_CHAR.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да я чё-то стормозил, подумал, что после первого вызова TranslateMessage значения структуры msg изменятся, а ничё подобного. Действительно, оконной процедуре идёт как одно так и другое сообщение. Щас смотрел в отладчике. Спасибо, поправили.