Чтение событий буфера вводимых данных


Функция 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;
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz