Форум программистов, компьютерный форум CyberForum.ru

getch() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 484, средняя оценка - 4.97
djess92
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 37
29.03.2011, 00:12     getch() #1
с помощью функции getch() узнал код клавиш...

C++
1
2
3
4
int n;
 
n = getch();
cout << n;
в результате esc = 27, backspace = 8, а вот стрелки (вверх,вниз,..) выдали код 22472 22480...

и когда я делаю сравнение, код не работает...

C++
1
2
3
4
5
6
7
8
int n;
 
n = getch()
 
if(n == 22472)
{
//сделать то то
}
какой правильный код управляющих стрелок и почему выдает такую странную цифру?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2011, 00:12     getch()
Посмотрите здесь:

getch C++
C++ Замена getch()
getch() C++
C++ Не работает getch()
getch и TCHAR C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
29.03.2011, 12:38     getch() #2
Небольшая иллюстрация:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <conio.h>
 
#define UP_ARROW 72
#define LEFT_ARROW 75
#define DOWN_ARROW 80
#define RIGHT_ARROW 77
 
using namespace std;
 
int main()
{   int KeyStroke;
    cout << "Press Escape to quit." << endl;
    do
{   KeyStroke = getch();
    if (KeyStroke == 224)
    {   KeyStroke = getch(); // Even though there are 2 getch() it reads one keystroke
        switch (KeyStroke)
        {
        case UP_ARROW:
            cout << "UP ARROW" << endl;
            break;
        case DOWN_ARROW:
            cout << "DOWN ARROW" << endl;
            break;
        case LEFT_ARROW:
            cout << "LEFT_ARROW" << endl;
            break;
        case RIGHT_ARROW:
            cout << "RIGHT_ARROW" << endl;
        break;
        default:
            cout << "Some other key." << endl;
        }
    }
    else cout << KeyStroke << endl;
 
}while (KeyStroke != 27); // 27 = Escape key
}
Добавлено через 10 часов 58 минут
Вот небольшое продолжение на эту же тему: можете порисовать символами '*' на консоли с помощью стрелок:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <conio.h>
#include <windows.h>
 
#define UP_ARROW 72
#define LEFT_ARROW 75
#define DOWN_ARROW 80
#define RIGHT_ARROW 77
 
using namespace std;
 
void gotoxy(int x,int y)
{
  HANDLE hConsole;
  COORD cursorLoc;
  cout.flush();
  cursorLoc.X = x;
  cursorLoc.Y = y;
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleCursorPosition(hConsole, cursorLoc);
}
 
int main()
{       int KeyStroke;
        cout << "Press Escape to quit." << endl;
        int i=40, j=10;
        gotoxy(i,j); cout<<"*";
        do
{       KeyStroke = getch();
        if (KeyStroke == 224)
        {       KeyStroke = getch(); // Even though there are 2 getch() it reads one keystroke
                switch (KeyStroke)
                {
                case UP_ARROW:
                        gotoxy(i,--j); cout<<"*";
                        break;
                case DOWN_ARROW:
                        gotoxy(i,++j); cout<<"*";
                        break;
                case LEFT_ARROW:
                        gotoxy(--i,j); cout<<"*";
                        break;
                case RIGHT_ARROW:
                        gotoxy(++i,j); cout<<"*";
                break;
               }
        }
 }while (KeyStroke != 27); // 27 = Escape key
}
djess92
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 37
29.03.2011, 20:46  [ТС]     getch() #3
спасибо ))
а вот почему при getch выдает такой большой код стрелок?
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
29.03.2011, 21:10     getch() #4
ну вам же привели код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <conio.h>
 
#define UP_ARROW 72
#define LEFT_ARROW 75
#define DOWN_ARROW 80
#define RIGHT_ARROW 77
 
using namespace std;
 
int main()
{       int KeyStroke;
        cout << "Press Escape to quit." << endl;
        do
{       KeyStroke = getch();
        if (KeyStroke == 224)
        {       KeyStroke = getch(); // Even though there are 2 getch() it reads one keystroke
                switch (KeyStroke)
                {
                case UP_ARROW:
                        cout << "UP ARROW" << endl;
                        break;
                case DOWN_ARROW:
                        cout << "DOWN ARROW" << endl;
                        break;
                case LEFT_ARROW:
                        cout << "LEFT_ARROW" << endl;
                        break;
                case RIGHT_ARROW:
                        cout << "RIGHT_ARROW" << endl;
                break;
                default:
                        cout << "Some other key." << endl;
                }
        }
        else cout << KeyStroke << endl;
 
}while (KeyStroke != 27); // 27 = Escape key
}
по нему видно что коды стрелок состоят из двух значений... 224 и там как получится в зависимости от стрелки... вверх стрелка - 72, влево - 75, вниз - 80, вправо - 77, вот вам и выдает 22472, 22475, 22480 или 22477
djess92
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 37
29.03.2011, 21:13  [ТС]     getch() #5
окай)спасибо
Neonbl4
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 3
16.09.2013, 12:48     getch() #6
красота)
Yandex
Объявления
16.09.2013, 12:48     getch()
Ответ Создать тему
Опции темы

Текущее время: 05:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru