Очередь входных сообщений консоли

Тема в разделе "WASM.WIN32", создана пользователем ADim, 23 фев 2010.

  1. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Подскажите, почему при создании новой консоли (FreeConsole(); AllocConsole();) спарадически во входном буфере консоли появляется клавиатурное сообщение (INPUT_RECORD -> EventType == KeyEvent) до какого-либо нажатия клавиши после появления консоли на экране? Вывод в консоль осуществляется, сброс входного буфера тоже.
    Т.е. примерно такой код:
    Код (Text):
    1. call   _FreeConsole@0
    2. call   _AllocConsole@0
    3.  
    4. push STD_INPUT_HANDLE
    5. call   _GetStdHandle@4
    6. mov  [dwInputHandle],eax
    7. push STD_OUTPUT_HANDLE
    8. call   _GetStdHandle@4
    9. mov  [dwOutputHandle],eax
    10.  
    11. push NULL
    12. push OFFSET dwNumberOfCharsWritten
    13. push HELLO_STR_LEN
    14. push OFFSET caHelloStr
    15. push eax
    16. push OFFSET caHelloStr
    17. push OFFSET caHelloStr
    18. call   _CharToOemA@8
    19. call   _WriteConsoleA@20
    20.  
    21. push [dwInputHandle]
    22. call   _FlushConsoleInputBuffer@4
    23.  
    24. my_wait_loop:
    25. push INFINITE
    26. push [dwInputHandle]
    27. call   _WaitForSingleObject@8
    28. push eax
    29. push esp
    30. push 1
    31. push OFFSET irInpRec
    32. push [dwInputHandle]
    33. call   _ReadConsoleInputA@16
    34. pop  eax
    35. cmp WORD PTR [irInpRec.EventType],KEY_EVENT
    36. jne   my_wait_loop
    Очередь сообщений обрабатывается как-то системой? Или по-другому, система может через какой-то промежуток времени изъять сообщение из очереди? Я не о Ctrl+C/Ctrl+Break. Если сообщения не изымаются, то до какого предела может вырасти очередь?
     
  2. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Вот, еще уточню: при вызове программы из проводника, или из Total Commander, или из Пуск->Выполнить, но при нажатии клавиши Enter, в буфере появится событие клавиатурного ввода, если же использовать мышь (в тех же условиях), то этого не произойдет.
     
  3. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Пользуйтесь консолью диспетчера csrss - зачем все делать через сами знгаете чего
     
  4. Extranger

    Extranger New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    34
    ADim
    Ну, так правильно ReadConsoleInput срабатывает дважды - первый раз, в момент, когда клавиша нажата, второй раз, в момент, когда клавиша отпущена. Когда вы запускаете свою программу через командную строку, вы вводите имя, нажимаете клавишу Enter, запускается программа, создается консоль, которая получает фокус ввода. Тут вы отпускаете Enter, и ReadConsoleInput естественно ловит это событие, пихая вам во входной буфер ваше клавиатурное сообщение.
     
  5. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Extranger
    Я бы это допустил, но как это объяснить с учетом вызова FlushConsoleInputBuffer()?

    RET
    Подскажите, как?
     
  6. Extranger

    Extranger New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    34
    ADim
    Ну очевидно, FlushConsoleInputBuffer срабатывает до того как вам приходит сообщение. Есть два варианта сделать так, что бы всё работало как надо:

    1) Засунуть где-нить перед вызовом FlushConsoleInputBuffer функцию Sleep c задержкой где-то на секунду-полторы.

    2) Добавить дополнительную проверку. Обрабатывать только события нажатия клавиш, игнорируя иные. То бишь надо проверять не только EventType но и KEY_EVENT_RECORD.bKeyDown, если последний равен нулю значит клавиша отпущена - игнорируем.
     
  7. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Ищите тут же на форуме