Консультация № 187310
30.04.2013, 17:38
94.25 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: как обработать события от двух и более клавиш в консольном приложении

Обсуждение

давно
Посетитель
7438
7205
01.05.2013, 22:14
общий
Здравствуйте, Виталий!
события от двух и более клавиш
Это какие имеются в виду? Ctrl, Alt, Shift?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.05.2013, 06:05
общий
Адресаты:
к примеру 'W' и 'A', вправо и вниз и т. д
давно
Посетитель
7438
7205
02.05.2013, 10:36
общий
Я же Вам давал пример.
Там же показано, как обрабатывать события от мыши и клавиатуры, в том числе.
Далее все просто, получаете код и обрабатываете по switch... В чем проблема?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.05.2013, 14:30
общий
пример хороший, проблема в том что если одновременно нажимаю на две клавиши то обрабатывается какая то одна из них, не получается у меня чтобы сразу две и более обработать, как в играх допустим влево и в право
давно
Посетитель
7438
7205
04.05.2013, 16:16
общий
это ответ
Здравствуйте, виталий!
Вот Вам пример на отработку одновременного нажатия на стрелки влево и вправо
[code h=200]#include <windows.h>
#include <stdio.h>

#define ST_LEFT 0x0001 //нажата LEFT
#define ST_RIGHT 0x0002 //RIGHT

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];
DWORD status = 0; //флаги состояния нажатий клавиш

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

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 KEY_EVENT: //ввод ок клавиатуры
switch (irInBuf[i].Event.KeyEvent.wVirtualKeyCode)
{
case VK_ESCAPE: //выйдем по ESC
SetConsoleMode(hStdin, fdwSaveOldMode);
exit(0);
case VK_LEFT:
if (irInBuf[i].Event.KeyEvent.bKeyDown)
{
status |= ST_LEFT; //фиксируем факт нажатия на Left
if (status & ST_RIGHT) //проверяем факт нажатия на Right
printf("Left and Right arrows pressed...\n");
else
printf("Left arrow pressed...\n");
}
else
status &= ~ST_LEFT; //клавиша отпущена!
break;
case VK_RIGHT: //аналогично
if (irInBuf[i].Event.KeyEvent.bKeyDown)
{
status |= ST_RIGHT;
if (status & ST_LEFT)
printf("Left and Right arrows pressed...\n");
else
printf("Right arrow pressed...\n");
}
else
status &= ~ST_RIGHT;
break;
}
//остальные игнорируем
}
}
}

return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Академик
20764
1861
05.05.2013, 13:31
общий
Цитата: 394488
проблема в том что если одновременно нажимаю на две клавиши то обрабатывается какая то одна из них, не получается у меня чтобы сразу две и более обработать

Так события по одному и приходят: нажата первая клавиша, нажата вторая, отпущена первая... Это модель такая - всё разделить, даже если произошло несколько событий одновременно. Всё остальное надо уже в своей программе обрабатывать.
Неизвестный
06.05.2013, 06:37
общий
Можно ещё использовать GetKeyState, но придётся постоянно крутить её в цикле.
Неизвестный
06.05.2013, 10:04
общий
Адресаты:
спасибо за разъяснение, вопрос снят
Форма ответа