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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 272, средняя оценка - 4.79
IFree Host
Заблокирован
07.01.2012, 16:00     Коды клавиш и обработка событий клавиатуры в консоли #1
Многие часто спрашивают один и тот же вопрос по поводу обработки событий нажатия клавиш в консоли.

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

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 (копия с экрана)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Диман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
43 / 32 / 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
Сообщений: 778
Записей в блоге: 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     Коды клавиш и обработка событий клавиатуры в консоли
Ответ Создать тему
Опции темы

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