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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 272, средняя оценка - 4.79
IFree Host
Заблокирован
#1

Коды клавиш и обработка событий клавиатуры в консоли - C++

07.01.2012, 16:00. Просмотров 38831. Ответов 5
Метки нет (Все метки)

Многие часто спрашивают один и тот же вопрос по поводу обработки событий нажатия клавиш в консоли.

вот простейший пример перехвата:

C++
1
2
3
4
5
6
7
8
9
int i_input;
 
i_input = getch();
 
switch (i_input)
{
case код клавиши: последующие команды; break;
case код клавиши: последующие команды; break;
}
Список десятичных индексов для функциональных клавиш:

13 enter
27 escape
8 backspace
32 space

72 Стрелка вверх
80 Стрелка вниз
75 Стрелка влево
77 Стрелка вправо

115 ctrl-стрелка влево
116 ctrl-стрелка вправо

82 ins (вставка)
83 del (удалить)

73 pgup (страница вверх)
81 pgdn (страница вниз)
118 ctrl-pgdn (страница вниз)
132 ctrl - pgup (страница вверх)

71 home (начало)
79 end (конец)
119 ctrl-home (начало)
117 ctrl-end (конец)

15 shift tab
16-25 alt - q/w/e/r/t/y/u/i/o/p
30-38 alt - a/s/d/f/g/h/j/k/l
44-50 alt - z/x/c/v/b/n/m

59-68 Ключи f1-f10 (нельзя использовать клавиши с изменяемой функцией)
84-93 f11-f20 (shift-f1 - shift-f10)
94-103 f21-f30 (ctrl-f1 - ctrl-f10)

104-113 f31-f40 (alt-f1 - alt-f10)

133 f11
134 f12
135 shift-f11
136 shift-f13
137 ctrl-f11
138 ctrl-f12
139 alt-f11
140 alt-f12

114 ctrl-prtsc (копия с экрана)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 16:00     Коды клавиш и обработка событий клавиатуры в консоли
Посмотрите здесь:

Коды специальных клавиш клавиатуры - C++
if(я нажимаю "F1") { cout << "Hello " << endl; }

Тетрис - Реализация таймера и обработка событий с клавиатуры - C++
Пишу консольный тетрис. Столкнулся с проблемой таймера и перехвата событий с клавиатуры. Раньше с такими вопросами не сталкивался, поэтому...

Не совпадают коды клавиш - C++
switch (key) { case 101 : dir=0; break; case 102 : dir=1; break; case 100 : dir=2;

Одинаковые коды клавиш-стрелочек - C++
Есть задача написать меню . В консольном приложении. Состоит из 6ти пунктов(строчек) Выбор строчи с помощью клавиш вверх вниз ,...

Пятнашки - Как сделать перехват нажатий клавиш в консоли - C++
Собственно есть реализация игры "Пятнашки" wasd и 4862 - управление (оно организовано через передвижение пустой фишки). Пока надо...

Обработка событий от мыши С++ - C++
Форумчане, сильно прошу, просто умоляю подкинуть какой то информации по обработке событий на чистом С++ без всяческих библиотек и тому...

Обработка нескольких событий - C++
На форму за короткое время приходит несколько (3-7) одинаковых событий, которые вызывают в свою очередь один и тот же метод. Каким образом...

Как сделать, чтобы сочетание клавиш 'enter'+'space' выходили из консоли - C++
#include <iostream> #include <conio.h> using namespace std; int main() { char c; cout<<"test\n"; ...

Обработка клавиш! - C++
кароче не могу написать программу в консоле каторая, если нажата клавиша space то выводится сообщение что клавиша нажата!, а если опущена...

Обработка нажатия клавиш - C++
Здравствуйте! Необходимо решить следующую задачу: Есть консольное приложение, которое разрабатывается с использованием C++, с...

Обработка событий (events) в Visual Studio - C++
У меня есть два события, они выполняют одинаковые действия, можно ли как то сделать вызов одного события в другом?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
07.01.2012, 16:15     Коды клавиш и обработка событий клавиатуры в консоли #2
В принципе,соглашусь с вами. Но перехват этот действует только в пределах консоли. Вы лучше расскажите популярно про глобальный перехват.
kisssko
31 / 31 / 2
Регистрация: 19.12.2011
Сообщений: 72
07.01.2012, 22:04     Коды клавиш и обработка событий клавиатуры в консоли #3
Глобальный перехват. Демонстрация работы.

Код для kbdhook.dll (компилировать в чистом Си компиляторе).


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
#include <windows.h>
 
#define DLL_EXPORT __declspec(dllexport)
 
typedef BOOL (*hookCB) (WPARAM,LPARAM);
 
HHOOK            hHKbd=NULL;
hookCB           hookCallBack;
 
LRESULT CALLBACK KbdProc(int nCode, WPARAM wParam, LPARAM lParam)
 {
  if(nCode==0)    {hookCallBack(wParam, lParam);}
  return CallNextHookEx(hHKbd,nCode,wParam,lParam);
 }
 
DLL_EXPORT HHOOK SetHook(HINSTANCE hModule, hookCB hookExtProc)
 {
  hookCallBack=hookExtProc;
  return (hHKbd = SetWindowsHookEx(WH_KEYBOARD_LL, KbdProc, hModule, 0));
 }
 
DLL_EXPORT BOOL UnHook(void)
 {
  return UnhookWindowsHookEx(hHKbd);
 }
Код приложения:

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
50
51
52
53
54
55
#include <stdio.h>
#include <windows.h>
 
typedef BOOL      (*UnHookProc) (void);
typedef HINSTANCE (*SetHookProc)(HINSTANCE,void*);
 
MSG                  msg;
HHOOK                hk=NULL;
DWORD                erc;
BOOL                 bRes;
KBDLLHOOKSTRUCT     *kbdata;
SetHookProc          SetHook;
UnHookProc           UnHook;
HINSTANCE            hDLL; 
HINSTANCE            hOwn;
 
BOOL hookCallBack(WPARAM wParam, LPARAM lParam)
 {
  kbdata = (KBDLLHOOKSTRUCT*)lParam;
  printf("Message: %X, Virtual Code: %02X, Scan Code: %02X, Flags: %X \n",
          wParam, kbdata->vkCode, kbdata->scanCode, kbdata->flags);
  return 1;
 }
 
int main(int argc, char **argv)
{
 
hDLL=LoadLibrary("kbdhook.dll");
SetHook=(SetHookProc)GetProcAddress(hDLL, "SetHook");
UnHook =( UnHookProc)GetProcAddress(hDLL,  "UnHook");
 
if(SetHook==NULL) 
 {
  erc=GetLastError();
  printf("Error (code: %d) \n", (int)erc);
  return 1;
 }
 
if(UnHook==NULL) 
 {
  erc=GetLastError();
  printf("Error (code: %d) \n", (int)erc);
  return 1;
 }
 
SetHook(hDLL, (void*)hookCallBack);
 
while(bRes=GetMessage(&msg,0,0,0)) 
 {
  printf("MSG:%X, WParam:%X, LParam:%X \n",
         (int)(msg.message&65535), msg.wParam, msg.lParam);
 }
 
UnHook();
}
Добавлено через 8 минут
Для расширенного ввода с консоли (в т.ч. использования мыши) можно пользоваться
функцией GenConsoleInput().
D_Ok
44 / 33 / 12
Регистрация: 11.02.2014
Сообщений: 134
23.02.2014, 20:03     Коды клавиш и обработка событий клавиатуры в консоли #4
Не работают часть кнопок, например 13, 27, 8, 32, считует, а стрелки нет, у меня ноут, могут у них быть другие коды?

Добавлено через 27 минут
решил проблему вот-таким способом:
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
#include <iostream>
#include <conio.h>
int main()
{
    using namespace std;
    char x;
    x = getch();
    switch (getch()) //перед этим было switch(x)
    {
    case 72:
        cout << "Up" << endl;
        break;
    case 80:
        cout << "Down" << endl;
        break;
    case 75:
        cout << "Left" << endl;
        break;
    case 77:
        cout << "Right" << endl;
        break;
    }
    return 0;
}
объясните почему надо писать выбор из считаного символа, а не x, или он не присваивает код стрелочек? Почему тогда с определенными кодами, работает метод с "x", а в случае стрелочек нет?
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 797
Записей в блоге: 10
17.12.2014, 14:53     Коды клавиш и обработка событий клавиатуры в консоли #5
Как организовать перехвать юзая лишь windows.h ?
not conio.h
ftvkyo2011
0 / 0 / 0
Регистрация: 21.05.2015
Сообщений: 13
08.08.2015, 21:50     Коды клавиш и обработка событий клавиатуры в консоли #6
объясните почему надо писать выбор из считанного символа, а не x, или он не присваивает код стрелочек? Почему тогда с определенными кодами, работает метод с "x", а в случае стрелочек нет?
Мой запоздалый ответ: Такие кнопки как стрелочки и функциональные кнопки возвращают сразу два значения, например:
Код
F1-F12: 0 59...68, -32 -123...-122
Up arrow: -32 72
Left arrow: -32 75
Right arrow: -32 77
Down arrow: -32 80
Остальные коды можно очень просто узнать используя
C++
1
2
3
4
5
6
7
...
button1 = _getch();
cout << "1: " << (int)button1;
button2 = _getch();
cout << " 2: " << (int)button2;
_getch();
...
Yandex
Объявления
08.08.2015, 21:50     Коды клавиш и обработка событий клавиатуры в консоли
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru