/*Чтение событий буфера вводимых данных
--------------------------------------------------------------------------------
Функция 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,
яки в неї доволі хитро вплутані, но цілісного розуміння я не маю.
Чи можна мені ще зразок хорошого коду, який би пояснював дію першого?
Будь ласка, покладить!
Це навить гарно, що трапилась помилка- я ще багато прочту.
*/