Подскажите, почему при создании новой консоли (FreeConsole(); AllocConsole() спарадически во входном буфере консоли появляется клавиатурное сообщение (INPUT_RECORD -> EventType == KeyEvent) до какого-либо нажатия клавиши после появления консоли на экране? Вывод в консоль осуществляется, сброс входного буфера тоже. Т.е. примерно такой код: Код (Text): call _FreeConsole@0 call _AllocConsole@0 push STD_INPUT_HANDLE call _GetStdHandle@4 mov [dwInputHandle],eax push STD_OUTPUT_HANDLE call _GetStdHandle@4 mov [dwOutputHandle],eax push NULL push OFFSET dwNumberOfCharsWritten push HELLO_STR_LEN push OFFSET caHelloStr push eax push OFFSET caHelloStr push OFFSET caHelloStr call _CharToOemA@8 call _WriteConsoleA@20 push [dwInputHandle] call _FlushConsoleInputBuffer@4 my_wait_loop: push INFINITE push [dwInputHandle] call _WaitForSingleObject@8 push eax push esp push 1 push OFFSET irInpRec push [dwInputHandle] call _ReadConsoleInputA@16 pop eax cmp WORD PTR [irInpRec.EventType],KEY_EVENT jne my_wait_loop Очередь сообщений обрабатывается как-то системой? Или по-другому, система может через какой-то промежуток времени изъять сообщение из очереди? Я не о Ctrl+C/Ctrl+Break. Если сообщения не изымаются, то до какого предела может вырасти очередь?
Вот, еще уточню: при вызове программы из проводника, или из Total Commander, или из Пуск->Выполнить, но при нажатии клавиши Enter, в буфере появится событие клавиатурного ввода, если же использовать мышь (в тех же условиях), то этого не произойдет.
ADim Ну, так правильно ReadConsoleInput срабатывает дважды - первый раз, в момент, когда клавиша нажата, второй раз, в момент, когда клавиша отпущена. Когда вы запускаете свою программу через командную строку, вы вводите имя, нажимаете клавишу Enter, запускается программа, создается консоль, которая получает фокус ввода. Тут вы отпускаете Enter, и ReadConsoleInput естественно ловит это событие, пихая вам во входной буфер ваше клавиатурное сообщение.
Extranger Я бы это допустил, но как это объяснить с учетом вызова FlushConsoleInputBuffer()? RET Подскажите, как?
ADim Ну очевидно, FlushConsoleInputBuffer срабатывает до того как вам приходит сообщение. Есть два варианта сделать так, что бы всё работало как надо: 1) Засунуть где-нить перед вызовом FlushConsoleInputBuffer функцию Sleep c задержкой где-то на секунду-полторы. 2) Добавить дополнительную проверку. Обрабатывать только события нажатия клавиш, игнорируя иные. То бишь надо проверять не только EventType но и KEY_EVENT_RECORD.bKeyDown, если последний равен нулю значит клавиша отпущена - игнорируем.