Обробка подій миші в консолі

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);