Функция ReadConsoleInput может быть использована для непосредственного обращения к буферу ввода консоли. Когда консоль создается, включается ввод информации от мыши, а ввод данных окна отключается. Чтобы гарантировать, что процесс получает все события ввода, этот пример использует функцию SetConsoleMode, чтобы включить ввод информации от окна и мыши. Затем он входит в цикл, который читает и обрабатывает консольные события ввода.
Обратите внимание! на то, что MyErrorExit - групповой символ - заместитель для определяемой программой функции, которая показывает на экране и обрабатывает аварийные ситуации. |
VOID MouseEventProc(MOUSE_EVENT_RECORD); VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); VOID KeyEventProc(KEY_EVENT_RECORD); VOID GetInputEvents(VOID); DWORD main(VOID) { HANDLE hStdin; DWORD cNumRead, fdwMode, fdwSaveOldMode, i; INPUT_RECORD irInBuf[128]; // Получим стандартный дескриптор ввода. hStdin = GetStdHandle(STD_INPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE) MyErrorExit("GetStdHandle"); // Сохраним текущий режим ввода для будущего восстановления при // выходе из программы. if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) MyErrorExit("GetConsoleMode"); // Включим события ввода от мыши и окна. fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; if (! SetConsoleMode(hStdin, fdwMode) ) MyErrorExit("SetConsoleMode"); // Цикл чтения и обработки событий ввода. while (1) { // Ожидание событий. if (! ReadConsoleInput( hStdin, // дескриптор буфера ввода irInBuf, // буфер, в котором читаем 128, // размер буфера чтения &cNumRead) ) // число прочитанных записей MyErrorExit("ReadConsoleInput"); // Направляем события соответствующим обработчикам. for (i = 0; i < cNumRead; i++) { switch(irInBuf[i].EventType) { case KEY_EVENT: // ввод с клавиатуры KeyEventProc(irInBuf[i].Event.KeyEvent); break; case MOUSE_EVENT: // ввод от мыши MouseEventProc(irInBuf[i].Event.MouseEvent); break; case WINDOW_BUFFER_SIZE_EVENT: // изменение размера // экранного буфера ResizeEventProc( irInBuf[i].Event.WindowBufferSizeEvent); break; case FOCUS_EVENT: // игнорирование событий фокуса case MENU_EVENT: // игнорирование событий меню break; default: MyErrorExit("unknown event type"); break; } } } return 0; } |