Windows 8 — C ++ Обнаружение, когда пользователь нажимает клавишу со стрелкой

У меня возникла проблема с обнаружением нажатий клавиш со стрелками в моем консольном приложении C ++. Я перепробовал все, что нашел, и здесь, и на других сайтах учебников, но все они дают мне то же самое, когда я нажимаю стрелку:

Process returned 0 <0x0> execution time : 2.249 s
Press any key to continue.

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

Способ первый:

c1 = getch();
if(c1 == 0)
{

c2 = getch();

if(c2 == 72) {cout << endl << "Up Arrow" << endl;}
else if(c2 == 80) {cout << endl << "Down Arrow" << endl;}
else{cout << endl << "Incorrect Input" << endl;}

}

Способ второй:

switch(getch()) {
case 65:
cout << endl << "Up" << endl;//key up
break;
case 66:
cout << endl << "Down" << endl;   // key down
break;
case 67:
cout << endl << "Right" << endl;  // key right
break;
case 68:
cout << endl << "Left" << endl;  // key left
break;
}

Есть ли какая-то ошибка в моем коде, которая заставила меня вернуться к основному методу, или он пропустил какой-то код? Есть ли более быстрый способ сделать это? Я почти на 100% уверен, что мой другой код не имеет ничего общего с этой проблемой, потому что я изолировал код от зависимости от любого другого аспекта программы, и у меня продолжала возникать та же проблема.

Опять же, я попробовал все способы получения нажатия клавиши со стрелкой, которые я мог найти, и я продолжаю получать ту же проблему. Если это имеет значение, я нахожусь на Windows 8 Samsung ATIV Smart PC и использую док-станцию ​​клавиатуры.

Заранее благодарю за любую помощь.

8

Решение

#include <conio.h>
#include <iostream>
using namespace std;

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77

int main()
{
int c = 0;
while(1)
{
c = 0;

switch((c=getch())) {
case KEY_UP:
cout << endl << "Up" << endl;//key up
break;
case KEY_DOWN:
cout << endl << "Down" << endl;   // key down
break;
case KEY_LEFT:
cout << endl << "Left" << endl;  // key left
break;
case KEY_RIGHT:
cout << endl << "Right" << endl;  // key right
break;
default:
cout << endl << "null" << endl;  // not arrow
break;
}

}

return 0;
}

вывод, как это:

Up

Down

Right

Left

Up

Left

Right

Right

Up

обнаружено нажатие клавиши со стрелкой!

12

Другие решения

Вот альтернативный способ сделать это без Геч () с помощью События (хорошо прокомментировал, и я попытался сделать это так просто, как мог)

#include <iostream>
#include <Windows.h>

int main(int argc, char *argv[]){

HANDLE rhnd = GetStdHandle(STD_INPUT_HANDLE);  // handle to read console

DWORD Events = 0;     // Event count
DWORD EventsRead = 0; // Events read from console

bool Running = true;

//programs main loop
while(Running) {

// gets the systems current "event" count
GetNumberOfConsoleInputEvents(rhnd, &Events);

if(Events != 0){ // if something happened we will handle the events we want

// create event buffer the size of how many Events
INPUT_RECORD eventBuffer[Events];

// fills the event buffer with the events and saves count in EventsRead
ReadConsoleInput(rhnd, eventBuffer, Events, &EventsRead);

// loop through the event buffer using the saved count
for(DWORD i = 0; i < EventsRead; ++i){

// check if event[i] is a key event && if so is a press not a release
if(eventBuffer[i].EventType == KEY_EVENT && eventBuffer[i].Event.KeyEvent.bKeyDown){

// check if the key press was an arrow key
switch(eventBuffer[i].Event.KeyEvent.wVirtualKeyCode){
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:   // if any arrow key was pressed break here
std::cout<< "arrow key pressed.\n";
break;

case VK_ESCAPE: // if escape key was pressed end program loop
std::cout<< "escape key pressed.\n";
Running = false;
break;

default:        // no handled cases where pressed
std::cout<< "key not handled pressed.\n";
break;
}
}

} // end EventsRead loop

}

} // end program loop

return 0;
}

(Благодаря комментатору я теперь знаю, что этот код не является стандартным, хотя он будет работать, если вы компилируете с g++подробнее в комментариях)

4

Проверьте http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx а также http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

#include<windows.h>
#include <stdio.h>

int main()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
DWORD NumInputs = 0;
DWORD InputsRead = 0;
bool running = true;

INPUT_RECORD irInput;

GetNumberOfConsoleInputEvents(hInput, &NumInputs);

ReadConsoleInput(hInput, &irInput, 1, &InputsRead);

switch(irInput.Event.KeyEvent.wVirtualKeyCode)
{
case VK_ESCAPE:
puts("Escape");
break;

case VK_LEFT:
puts("Left");
break;

case VK_UP:
puts("Up");
break;

case VK_RIGHT:
puts("Right");
break;

case VK_DOWN:
puts("Down");
break;
}

}
1

// Example for inputting a single keystroke in C++ on Linux
// by Adam Pierce <[email protected]> on http://www.doctort.org/adam/nerd-notes/reading-single-keystroke-on-linux.html
// This code is freeware. You are free to copy and modify it any way you like.
// Modify by me Putra Kusaeri#include <iostream>
#include <termios.h>
#define STDIN_FILENO 0
using namespace std;
int main()
{
// Black magic to prevent Linux from buffering keystrokes.
struct termios t;
tcgetattr(STDIN_FILENO, &t);
t.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &t);

// Once the buffering is turned off, the rest is simple.
cout << "Enter a character: ";
char c,d,e;
cin >> c;
cin >> d;
cin >> e;
cout << "\nYour character was ";
// Using 3 char type, Cause up down right left consist with 3 character
if ((c==27)&&(d=91)) {
if (e==65) { cout << "UP";}
if (e==66) { cout << "DOWN";}
if (e==67) { cout << "RIGHT";}
if (e==68) { cout << "LEFT";}
}
return 0;
}
1
По вопросам рекламы [email protected]