/*Чтение событий буфера вводимых данных
--------------------------------------------------------------------------------
Функция ReadConsoleInput может быть использована для непосредственного обращения к буферу ввода консоли.
 Когда консоль создается, включается ввод информации от мыши, а ввод данных окна 
 отключается. Чтобы гарантировать, что процесс получает все события ввода, этот пример 
 использует функцию SetConsoleMode, чтобы включить ввод информации от окна и мыши. 
 Затем он входит в цикл, который читает и обрабатывает консольные события ввода.
Обратите внимание! на то, что MyErrorExit - групповой символ - заместитель для 
определяемой программой функции, которая показывает на экране и обрабатывает аварийные 
ситуации. */
#include <windows.h>
#include <stdio.h>
 
VOID MouseEventProc(MOUSE_EVENT_RECORD);
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);
VOID KeyEventProc(KEY_EVENT_RECORD);
VOID GetInputEvents(VOID);
/*void MyErrorExit(LPTSTR lpszMessage) 
{
   fprintf(stderr, "%s\n", lpszMessage);
   // Exit peacefully...
   ExitProcess(0); 
} */
  void MyErrorExit(LPTSTR lpszMessage)
  {
        MessageBox(NULL, "lpszMessage", "Console Error", MB_OK);
        return;
    }
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;
} 
/*
Ошибка    1    error LNK2019: ссылка на неразрешенный внешний символ 
"void __cdecl ResizeEventProc(struct _WINDOW_BUFFER_SIZE_RECORD)"
 (?ResizeEventProc@@YAXU_WINDOW_BUFFER_SIZE_RECORD@@@Z) в функции
 _main    
 
 
 Що таке ця помилка і звідки вона береться?   Що таке цей заборонений символ і код
 його начебто не зве?
 Звідки програма в цьому випадку зна, що їй взагалі необхідна ця struct _WINDOW_BUFFER_SIZE_RECORD?
 
 Чи повинен я це так розуміти що при створенні консолі
 _WINDOW_BUFFER_SIZE_RECORD може бути створена автоматично - або я зобовязаний її оголосити та ініціалізувати?
 Я начебто розумію-
 MOUSE_EVENT_RECORD та інші - це також члени структури INPUT_RECORD,
 яки в неї доволі хитро вплутані, но цілісного розуміння я не маю.
Чи можна мені ще зразок хорошого коду, який би пояснював дію першого?
Будь ласка, покладить!
Це навить гарно, що трапилась помилка- я ще багато прочту.
*/