Работа с мышью в консольной программе и программное отключение режима выделения мышью


Автор: Рэймонд Чен.
Оригинал статьи: Reading mouse input from a console program, and programmatically turning off Quick Edit mode.

Сегодняшняя программка показывает, как работать с мышью в консольной программе. Это может быть полезно, если вы пишете консольный текстовый редактор с поддержкой мыши или хотите добавить поддержку мыши в свою игру.

Но я не собираюсь реализовывать игру. Я всего лишь буду выводить координаты курсора мыши на экран.

#define UNICODE
#define _UNICODE
#include
#include
#include

int __cdecl _tmain(int argc, PTSTR argv[])
{
 HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
 BOOL fContinue = TRUE;
 DWORD dwEvents;
 INPUT_RECORD input;
 while (fContinue &&
        ReadConsoleInput(hConsole, &input, 1, &dwEvents) &&
        dwEvents > 0) {
  switch (input.EventType) {
  case KEY_EVENT:
   if (input.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) {
    fContinue = FALSE;
   }
  case MOUSE_EVENT:
   _tprintf(TEXT("X=%d, Y=%d; buttons=%x, shift=%x, flags=%x\n"),
     input.Event.MouseEvent.dwMousePosition.X,
     input.Event.MouseEvent.dwMousePosition.Y,
     input.Event.MouseEvent.dwButtonState,
     input.Event.MouseEvent.dwControlKeyState,
     input.Event.MouseEvent.dwEventFlags);
   break;
  }
 }
 return 0;
}

Наша программа собирает в цикле команды ввода, при получении событий мыши она выводит координаты. «Вставьте код игры здесь.» После нажатия клавиши Esc программа завершает работу.

Запустите программу, подвигайте мышью над окном и… ничего не происходит!

Ах да, мы же забыли включить ввод мыши. Попробуем ещё раз.

...
 HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);

 DWORD dwPreviousMode = 0;
 GetConsoleMode(hConsole, &dwPreviousMode);
 DWORD dwNewMode = dwPreviousMode | ENABLE_MOUSE_INPUT;
 SetConsoleMode(hConsole, dwNewMode);
 }

 BOOL fContinue = TRUE;
 ...
 }

 SetConsoleMode(hConsole, dwPreviousMode);

 return 0;
}

Это маленькая программка, поэтому в ней не будет обработки ошибок.

Теперь можно запустить программу. Когда вы будете двигать мышь над окном, вы увидите… Ну, это зависит от… У кого-то что-то будет, а у кого-то – нет.

У тех, кто ничего не видит, в консоли включён режим Выделение мышью, который эксплуатирует мышь для копирования/вставки вместо передачи ввода приложению. Это удобно, если большую часть времени вы работаете с программами, которые не используют мышь, т.к. вам не надо каждый раз обращаться к меню Изменить.

Режим "Выделение мышью"

Но это неудобно при работе с программами, которые используют мышь.

Добавьте ещё одну строку кода, чтобы выключить режим Выделение мышью:

DWORD dwNewMode = dwPreviousMode | ENABLE_MOUSE_INPUT;
 dwNewMode &= ~ENABLE_QUICK_EDIT_MODE;
 SetConsoleMode(hConsole, dwNewMode);

Теперь, когда вы запускаете программу и двигаете мышью… по-прежнему ничего не происходит.

Ну конечно, ENABLE_QUICK_EDIT_MODE – это расширенный флаг, а если вы хотите изменить расширенный флаг, то вы также должны передать флаг ENABLE_EXTENDED_FLAGS. (Вы можете догадаться, как я узнал об этом.)

dwNewMode &= ~ENABLE_QUICK_EDIT_MODE;
 SetConsoleMode(hConsole, dwNewMode |
                          ENABLE_EXTENDED_FLAGS);

 ...
 SetConsoleMode(hConsole, dwPreviousMode |
                          ENABLE_EXTENDED_FLAGS);

Наконец-то можно запустить программу, подвигать мышью и увидеть её координаты на экране. Всё.

Упражнение. Подумайте, зачем нужен безумный флаг ENABLE_EXTENDED_FLAGS. Дополнительно придумайте способ решения задачи без использования этого флага.

Реклама
Запись опубликована в рубрике перевод, программирование с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s