Консультация № 187283
16.04.2013, 15:57
95.44 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: как подключить мышь и обработать события от мыши в консоли, использую Visual Studio 10

Обсуждение

давно
Посетитель
7438
7205
16.04.2013, 17:24
общий
это ответ
Здравствуйте, виталий!
Вот Вам пример на чистом WinAPI
[code h=200]#include <windows.h>
#include <stdio.h>
#include <conio.h>

VOID MouseEventProc(MOUSE_EVENT_RECORD &mer)
{
printf("MousePosition: x = %d, y= %d\n", mer.dwMousePosition.X, mer.dwMousePosition.Y);
if (mer.dwButtonState)
{
printf("ButtonState:");
if (mer.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
printf(" FROM_LEFT_1ST_BUTTON_PRESSED");
if (mer.dwButtonState & RIGHTMOST_BUTTON_PRESSED)
printf(" RIGHTMOST_BUTTON_PRESSED");
if (mer.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
printf(" FROM_LEFT_2ND_BUTTON_PRESSED");
if (mer.dwButtonState & FROM_LEFT_3RD_BUTTON_PRESSED)
printf(" FROM_LEFT_3RD_BUTTON_PRESSED");
if (mer.dwButtonState & FROM_LEFT_4TH_BUTTON_PRESSED)
printf(" FROM_LEFT_4TH_BUTTON_PRESSED");
printf("\n");
}
if (mer.dwControlKeyState)
{
printf("ControlKeyState:");
if (mer.dwControlKeyState & RIGHT_ALT_PRESSED)
printf(" RIGHT_ALT_PRESSED");
if (mer.dwControlKeyState & LEFT_ALT_PRESSED)
printf(" LEFT_ALT_PRESSED");
if (mer.dwControlKeyState & RIGHT_CTRL_PRESSED)
printf(" RIGHT_CTRL_PRESSED");
if (mer.dwControlKeyState & LEFT_CTRL_PRESSED)
printf(" LEFT_CTRL_PRESSED");
if (mer.dwControlKeyState & SHIFT_PRESSED)
printf(" SHIFT_PRESSED");
if (mer.dwControlKeyState & NUMLOCK_ON)
printf(" NUMLOCK_ON");
if (mer.dwControlKeyState & SCROLLLOCK_ON)
printf(" SCROLLLOCK_ON");
if (mer.dwControlKeyState & CAPSLOCK_ON)
printf(" CAPSLOCK_ON");
if (mer.dwControlKeyState & ENHANCED_KEY)
printf(" ENHANCED_KEY");
printf("\n");
}
if (mer.dwEventFlags)
{
printf("EventFlags:");
if (mer.dwEventFlags & MOUSE_MOVED)
printf(" MOUSE_MOVED");
if (mer.dwEventFlags & DOUBLE_CLICK)
printf(" DOUBLE_CLICK");
if (mer.dwEventFlags & MOUSE_WHEELED)
printf(" MOUSE_WHEELED");
printf("\n");
}
}

void MyErrorExit(char * pErr)
{
printf("Error: %s\n", pErr);
getch();
exit(1);
}

DWORD main(VOID)
{
HANDLE hStdin;
DWORD cNumRead, fdwSaveOldMode, i;
INPUT_RECORD irInBuf[128];

// Получим стандартный дескриптор ввода.

hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
MyErrorExit("GetStdHandle");

// Сохраним текущий режим ввода для будущего восстановления при
// выходе из программы.

if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )
MyErrorExit("GetConsoleMode");

// Включим события ввода от мыши.

if (! SetConsoleMode(hStdin, ENABLE_MOUSE_INPUT) )
MyErrorExit("SetConsoleMode");

// Цикл чтения и обработки событий ввода.

while (1)
{

// Ожидание событий.

if (! ReadConsoleInput(
hStdin, // дескриптор буфера ввода
irInBuf, // буфер, в котором читаем
128, // размер буфера чтения
&cNumRead) ) // число прочитанных записей
MyErrorExit("ReadConsoleInput");

// Направляем события соответствующим обработчикам.

for (i = 0; i < cNumRead; i++)
{
switch(irInBuf[i].EventType)
{
case MOUSE_EVENT: // ввод от мыши
MouseEventProc(irInBuf[i].Event.MouseEvent);
break;
case KEY_EVENT: //ввод ок клавиатуры
if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{ //выйдем по ESC
SetConsoleMode(hStdin, fdwSaveOldMode);
exit(0);
}
//остальные игнорируем
}
}
}

return 0;
}[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.04.2013, 19:11
общий
Адресаты:
DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
не могу найти где используется переменная fdwMode, нужна ли она?
давно
Посетитель
7438
7205
16.04.2013, 19:23
общий
16.04.2013, 19:25
Можно убрать. Изначально в эту переменную заносилась константа ENABLE_MOUSE_INPUT.
А переменная осталась.
Я убрал ее из кода
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.04.2013, 15:36
общий
Адресаты:
for (i = 0; i < cNumRead; i++)
{
switch(irInBuf[i].EventType)
{
case MOUSE_EVENT: // ввод от мыши
MouseEventProc(irInBuf[i].Event.MouseEvent);
break;
case KEY_EVENT: //ввод ок клавиатуры
if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{ //выйдем по ESC
SetConsoleMode(hStdin, fdwSaveOldMode);
exit(0);
}
//остальные игнорируем
}
}

не смог разобраться с переменной cNumRead, какое оно принимает значение?
давно
Посетитель
7438
7205
17.04.2013, 15:50
общий
17.04.2013, 16:03
Функция ReadConsoleInput возвращает события в массиве структур типа INPUT_RECORD.
В переменной cNumRead, адрес которой задается последним параметром, возвращается
количество событий и, соответственно, заполненных структур.
Читайте MSDN
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа