Обробка подій миші в консолі
1. Проблема
Було помічено, що в консольних програмах, запущених в операційних системах Windows 7 та Windows 10, не працює доступ до вхідного буфера у випадку подій від миші. При читанні подій з вхідного буфера функцією ReadConsoleInput() тип події MOUSE_EVENT просто не з'являється. Події від клавіатури типу KEY_EVENT доступні.
2. Причина
Розвідка показала, що така поведінка пов'язана з режимом консолі, який встановлюється після її запуску. В різних операційних системах за умовчанням встановлюються різні режими консолі.
3. Вирішення проблеми
Режим вхідного буфера консолі визначається станом прапорців, зокрема ENABLE_LINE_INPUT, ENABLE_ECHO_INPUT, ENABLE_PROCESSED_INPUT, ENABLE_WINDOW_INPUT, ENABLE_MOUSE_INPUT та ін. Стан прапорців можна одержати за допомогою функції GetConsoleMode(), а змінити за допомогою функції SetConsoleMode().
Для того, щоб активізувати обробку подій миші в консолі в операційних системах Windows 7, Windows 10, потрібно дозволити використання розширених прапорців шляхом встановлення ENABLE_EXTENDED_FLAGS та встановити прапорці ENABLE_WINDOW_INPUT, ENABLE_MOUSE_INPUT.
Зробити це можна наступним чином:
DWORD fdwOldMode, fdwNewMode;
...
// зберігаємо режим консолі за умовчанням
GetConsoleMode(hConsoleInput, &fdwOldMode);
...
// формуємо набір прапорців
fdwNewMode = ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
// встановлюємо новий режим консолі
SetConsoleMode(hConsoleInput, fdwNewMode);
...
Далі здійснюємо доступ до вхідного буфера через ReadConsoleInput()
В кінці програми повертаємо попердній режим консолі:
SetConsoleMode(hConsoleInput, fdwOldMode);