Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/921: Рейтинг темы: голосов - 921, средняя оценка - 4.80
Заблокирован

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

07.01.2012, 16:00. Показов 176363. Ответов 6
Метки нет (Все метки)

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

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

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 (копия с экрана)
3
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2012, 16:00
Ответы с готовыми решениями:

Коды клавиш клавиатуры
Коды клавиш клавиатуры задаются в коде операционной системы или в коде, записанном в комплектующие компьютера? Как узнавать коды для...

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

Коды клавиш русской клавиатуры
Подскажите пожалуйста коды для русской клавиатуры Windows7 (коды русских букв 192-223 не работают)

6
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
07.01.2012, 16:15
В принципе,соглашусь с вами. Но перехват этот действует только в пределах консоли. Вы лучше расскажите популярно про глобальный перехват.
0
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
07.01.2012, 22:04
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Глобальный перехват. Демонстрация работы.

Код для 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().
3
48 / 37 / 27
Регистрация: 11.02.2014
Сообщений: 134
23.02.2014, 20:03
Не работают часть кнопок, например 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", а в случае стрелочек нет?
1
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
17.12.2014, 14:53
Как организовать перехвать юзая лишь windows.h ?
not conio.h
0
0 / 0 / 0
Регистрация: 21.05.2015
Сообщений: 13
08.08.2015, 21:50
объясните почему надо писать выбор из считанного символа, а не x, или он не присваивает код стрелочек? Почему тогда с определенными кодами, работает метод с "x", а в случае стрелочек нет?
Мой запоздалый ответ: Такие кнопки как стрелочки и функциональные кнопки возвращают сразу два значения, например:
Code
1
2
3
4
5
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();
...
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
13.10.2021, 17:40
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.10.2021, 17:40
Помогаю со студенческими работами здесь

Коды клавиш клавиатуры в Pascal ABC
Не могли бы Вы посоветовать, где можна найти справку о кодах клавиш клавиатуры в Pascal ABC?

Получить коды клавиш стрелок клавиатуры
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main() { unsigned char g; do { g=getch(); ...

Назначение клавиш и обработка событий
package Menu; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import...

Обработка нажатий клавиш или событий?
В Лотусе при наборе фамилии в новой записке и нажатии Enter, вываливает сразу первая попавшаяся запись с такой фамилией из локальной АК,...

Перехват событий нажатия клавиш (стрелок клавиатуры)
Доброе время суток! Подскажите как перехватить нажатие клавиш &quot;вверх&quot;, &quot;вниз&quot;, &quot;влево&quot;, &quot;вправо&quot; на форме, с...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru