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

Как запрограммировать распознавание нажатия клавиш PageUp и PageDown

20.11.2009, 21:35. Показов 2393. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые обыватели КиберФорума. Заканчивая работу над курсовым проектированием, приступил к отладке программы (задача программы - работа с информацией - добавление, удаление, редактирование, просмотр, сохранение в выходной форме) и решил, что листинг таблицы сотрудников, который сделал я (пример - ниже), не очень-то подойдёт для работы со списками в 500-1000 сотрудников (прокрутка осуществляется при помощи клавиш 'вверх' и 'вниз' - при этом справа от таблицы появляется курсор-бегунок, который указывает на конкретный элемент - и листать таблицу таким образом, чтобы дойти, допустим, до 755 сотрудника, будет не совсем удобно, да и времени займёт немало). Поэтому я решил добавить 2 дополнительных цикла 'case' с клавишами PageUp и PageDown (которые, соответственно, обеспечивали бы полистовую прокрутку - за одно нажатие таблица бы переходила к очередному набору сотрудников.

Поскольку пишу программу я на Си, а экран DOS ограничен по-вертикали, пришлось ограничить количество выводимых элементов (сотрудников) до 18 (остальное пространство - вывод 'шапки' и 'подвала' таблицы).

Суть моего вопроса: как запрограммировать распознавание нажатия клавиш PageUp и PageDown (в данный момент всё, что я знаю - это: клавиша 'вниз' - код '80', клавиша 'вверх' - '72', клавиша 'Escape' - '27')

Заранее всем заглянувшим и откликнувшимся большое спасибо. Жду ваших ответов...

P.S.: вот, собственно, исходник процедуры просмотра таблицы:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
void view_table()               /*процедура просмотра таблицы исходных данных*/
{
if (count>0)
{
 listptr temp;                  /*переменная типа 'указатель'*/
 clrscr();                  /*очистка экрана*/
 char c;                    /*объявление перменной 'c' типа 'char'*/
 int curpos = 0,ppos = 0;           /*переменные для контроля поцизии курсора-бегунка*/
 temp=top;                  /*в указатель temp передать начало списка*/
 while(1)               
  {                 
  clrscr();                 /*очистка экрана*/
   print_shapka();              /*вызов процедуры печати 'шапки' таблицы*/
    for(int i=1;i<=18;i++)          /*от 1 до 18 элементов*/
    {
     if (temp!=NULL)                /*если есть элемент*/
      {
    if (temp->info.pol==1) c='М'; else c='Ж'; /*определение пола относительно поля 'info.pol'*/
    printf("║%2d│ %-16s │%4d│%3c│ %-13s│%4d│%4d│%4d│%4d│%6d║\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/
    temp=temp->next;                /*перейти к слещующему элементу*/
      }
    };
    print_bottom();             /*вызов процедуры печати 'подвала' таблицы*/
    char ch;                    /*объявление перменной 'ch' типа 'char'*/
    while(1)
    {
    switch(ch = getch())            /*ожидание нажатия клавиши*/
    {
     case 80:                   /*если нажата клавиша 'вниз'*/
     {
      if(curpos < count)            /*если позиция курсора-бегунка меньше количества элементов*/
      {
       ppos = ++curpos;             /*увеличить позицию будующего и текущего расположения курсора-бегунка*/
       gotoxy(76,ppos+4-1);         /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/
       printf("   ");               /*стереть предыдущее изображение куросра-бегунка*/
       if(curpos > 18)              /*если позиция курсора-бегунка больше 18*/
       {
    ppos = 18;              /*запомнить позицию будующего расположения куросора-бегунка в переменной 'ppos'*/
    temp = top;             /*в указатель temp передать начало списка*/
    for(int i = 0;i < curpos-18;i++)    /*сдвинуть первый выводимый на экран элемент на 1*/
    temp = temp->next;          /*сдвинуть первый выводимый на экран элемент на 1*/
    clrscr();               /*очистка экрана*/
    print_shapka();             /*вызов процедуры печати 'шапки' таблицы*/
    for(int j = 0;j < 18;j++)       /*от 1 до 18 элементов*/
     {
      if(temp)              /*если есть элемент*/
      {
       if(temp->info.pol==1) c='М'; else c='Ж';   /*определение пола относительно поля 'info.pol'*/
       printf("║%2d│ %-16s │%4d│%3c│ %-13s│%4d│%4d│%4d│%4d│%6d║\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/
       temp = temp->next;               /*перейти к слещующему элементу*/
      }
     }
     print_bottom();            /*вызов процедуры печати 'подвала' таблицы*/
       }
      }
      gotoxy(76,ppos+4);            /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/            
      printf("<<<");                /*напечатать курсор-бегунок*/
      break;                    /*выход из цикла*/
     }
     case 72:                   /*если нажата клавиша 'вверх'*/
     {
      if(curpos > 0)
      {
       ppos--;                  /*уменьшить позицию будующего расположения курсора-бегунка*/
       if(ppos < 0) ppos = 0;           /*если позиция будующего расположения куросра-бегунка меньше 0*/
       curpos--;                /*уменшить текущую позицию курсора-бегунка*/
       gotoxy(76,ppos+4+2);         /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/
       printf("   ");               /*стереть предыдущее изображение куросра-бегунка*/
       if(curpos >= 0)              /*если текущая позиция курсора-бегунка больше либо равно 0*/
       {
    if(ppos == 0)               /*если позиция будующего расположения курсора-бегунка равна 0*/
    {
     temp = top;                /*в указатель temp передать начало списка*/
     for(int i = 0;i < curpos;i++)      /*сдвинуть первый выводимый на экран элемент на 1*/
     temp = temp->next;         /*сдвинуть первый выводимый на экран элемент на 1*/
     clrscr();              /*очистка экрана*/
     print_shapka();            /*вызов процедуры печати 'шапки' таблицы*/
     for(int j = 0;j < 18;j++)      /*от 1 до 18 элементов*/
      {
       if(temp)             /*если есть элемент*/
       {
        if(temp->info.pol==1) c='М'; else c='Ж';  /*определение пола относительно поля 'info.pol'*/
        printf("║%2d│ %-16s │%4d│%3c│ %-13s│%4d│%4d│%4d│%4d│%6d║\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa);
        temp = temp->next;              /*перейти к слещующему элементу*/
       }
      }
      print_bottom();           /*вызов процедуры печати 'подвала' таблицы*/
       }}
      }
      gotoxy(76,ppos+4+1);          /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/
      printf("<<<");                /*напечатать курсор-бегунок*/
      break;                    /*выход из цикла*/
     }
     case 27 : return;              /*если нажата клавиша 'Escape' - выйти из процедуры просмотра таблицы*/
    }
    }
  }
}
};
P.S.S.: 2 скрина - первый - просто таблица, второй - таблица с тем самым курсором-бегунком.
Миниатюры
Как запрограммировать распознавание нажатия клавиш PageUp и PageDown   Как запрограммировать распознавание нажатия клавиш PageUp и PageDown  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2009, 21:35
Ответы с готовыми решениями:

OCX в Access97 - не приходят события нажатия клавиш 'Insert','Home','PageUp','Delete','End','PageDown'
Создал на VB6 OCX контрол Поместил его на форму Access Все бы хорошо, но почему-то в него не приходят события нажатия клавиш...

PageDown - PageUp
На странице строится некий график за период (Год или месяц) Было бы естественно по клавишам PgDn (code=34), PgUp(code=33) строить график...

Распознавание нажатия клавиш
Народ всем привет... Как осуществить на с++ такую вот прикалюху: при нажатии клавиши, например стрелочки в строковую переменную...

4
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
21.11.2009, 12:48
Цитата Сообщение от happyserge Посмотреть сообщение
Суть моего вопроса: как запрограммировать распознавание нажатия клавиш PageUp и PageDown (в данный момент всё, что я знаю - это: клавиша 'вниз' - код '80', клавиша 'вверх' - '72', клавиша 'Escape' - '27')
Поищи в справке по WinAPI тему "Virtual-Key Codes". Там есть все, что надо...
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
21.11.2009, 15:48
Или
смотри тут
The following table shows the symbolic constant names, hexadecimal values, and keyboard equivalents for the virtual-key codes used by the Microsoft Windows operating system. The codes are listed in numeric order.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Symbolic constant name  Value (hexadecimal) Mouse or keyboard equivalent
VK_LBUTTON  01  Left mouse button 
VK_RBUTTON  02  Right mouse button 
VK_CANCEL   03  Control-break processing 
VK_MBUTTON  04  Middle mouse button (three-button mouse) 
 -  05-07   Undefined 
VK_BACK 08  BACKSPACE key 
VK_TAB  09  TAB key 
 -  0A-0B   Undefined 
VK_CLEAR    0C  CLEAR key 
VK_RETURN   0D  ENTER key 
 -  0E-0F   Undefined 
VK_SHIFT    10  SHIFT key 
VK_CONTROL  11  CTRL key 
VK_MENU 12  ALT key 
VK_PAUSE    13  PAUSE key 
VK_CAPITAL  14  CAPS LOCK key 
 -  15-19   Reserved for Kanji systems 
 -  1A  Undefined 
VK_ESCAPE   1B  ESC key 
 -  1C-1F   Reserved for Kanji systems 
VK_SPACE    20  SPACEBAR 
VK_PRIOR    21  PAGE UP key 
VK_NEXT 22  PAGE DOWN key 
VK_END  23  END key 
VK_HOME 24  HOME key 
VK_LEFT 25  LEFT ARROW key 
VK_UP   26  UP ARROW key 
VK_RIGHT    27  RIGHT ARROW key 
VK_DOWN 28  DOWN ARROW key 
VK_SELECT   29  SELECT key 
 -  2A  Original equipment manufacturer (OEM) specific 
VK_EXECUTE  2B  EXECUTE key 
VK_SNAPSHOT 2C  PRINT SCREEN key for Windows 3.0 and later 
VK_INSERT   2D  INS key 
VK_DELETE   2E  DEL key 
VK_HELP 2F  HELP key 
VK_0    30  0 key 
VK_1    31  1 key 
VK_2    32  2 key 
VK_3    33  3 key 
VK_4    34  4 key 
VK_5    35  5 key 
VK_6    36  6 key 
VK_7    37  7 key 
VK_8    38  8 key 
VK_9    39  9 key 
 -  3A-40   Undefined 
VK_A    41  A key 
VK_B    42  B key 
VK_C    43  C key 
VK_D    44  D key 
VK_E    45  E key 
VK_F    46  F key 
VK_G    47  G key 
VK_H    48  H key 
VK_I    49  I key 
VK_J    4A  J key 
VK_K    4B  K key 
VK_L    4C  L key 
VK_M    4D  M key 
VK_N    4E  N key 
VK_O    4F  O key 
VK_P    50  P key 
VK_Q    51  Q key 
VK_R    52  R key 
VK_S    53  S key 
VK_T    54  T key 
VK_U    55  U key 
VK_V    56  V key 
VK_W    57  W key 
VK_X    58  X key 
VK_Y    59  Y key 
VK_Z    5A  Z key 
VK_LWIN 5B  Left Windows key (Microsoft Natural Keyboard) 
VK_RWIN 5C  Right Windows key (Microsoft Natural Keyboard) 
VK_APPS 5D  Applications key (Microsoft Natural Keyboard) 
 -  5E-5F   Undefined 
VK_NUMPAD0  60  Numeric keypad 0 key 
VK_NUMPAD1  61  Numeric keypad 1 key 
VK_NUMPAD2  62  Numeric keypad 2 key 
VK_NUMPAD3  63  Numeric keypad 3 key 
VK_NUMPAD4  64  Numeric keypad 4 key 
VK_NUMPAD5  65  Numeric keypad 5 key 
VK_NUMPAD6  66  Numeric keypad 6 key 
VK_NUMPAD7  67  Numeric keypad 7 key 
VK_NUMPAD8  68  Numeric keypad 8 key 
VK_NUMPAD9  69  Numeric keypad 9 key 
VK_MULTIPLY 6A  Multiply key 
VK_ADD  6B  Add key 
VK_SEPARATOR    6C  Separator key 
VK_SUBTRACT 6D  Subtract key 
VK_DECIMAL  6E  Decimal key 
VK_DIVIDE   6F  Divide key 
VK_F1   70  F1 key 
VK_F2   71  F2 key 
VK_F3   72  F3 key 
VK_F4   73  F4 key 
VK_F5   74  F5 key 
VK_F6   75  F6 key 
VK_F7   76  F7 key 
VK_F8   77  F8 key 
VK_F9   78  F9 key 
VK_F10  79  F10 key 
VK_F11  7A  F11 key 
VK_F12  7B  F12 key 
VK_F13  7C  F13 key 
VK_F14  7D  F14 key 
VK_F15  7E  F15 key 
VK_F16  7F  F16 key 
VK_F17  80H F17 key 
VK_F18  81H F18 key 
VK_F19  82H F19 key 
VK_F20  83H F20 key 
VK_F21  84H F21 key 
VK_F22  85H F22 key 
VK_F23  86H F23 key 
VK_F24  87H F24 key 
 -  88-8F   Unassigned 
VK_NUMLOCK  90  NUM LOCK key 
VK_SCROLL   91  SCROLL LOCK key 
 -  92-B9   Unassigned 
 -  BA-C0   OEM specific 
 -  C1-DA   Unassigned 
 -  DB-E4   OEM specific 
 -  E5  Unassigned 
 -  E6  OEM specific 
 -  E7-E8   Unassigned 
 -  E9-F5   OEM specific 
VK_ATTN F6  Attn key
VK_CRSEL    F7  CrSel key
VK_EXSEL    F8  ExSel key
VK_EREOF    F9  Erase EOF key
VK_PLAY FA  Play key
VK_ZOOM FB  Zoom key
VK_NONAME   FC  Reserved for future use. 
VK_PA1  FD  PA1 key
VK_OEM_CLEAR    FE  Clear key
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
21.11.2009, 16:02  [ТС]
VK_UP 26 UP ARROW key
VK_DOWN 28 DOWN ARROW key

уже смотрел что-то подобное - пробовал из этой таблицы подставлять коды (я же правильно понимаю - 26 и 28 в данном случае коды?) - они не работают. Может я что-то не так делаю?

P.S.: эти коды отличаются от значений в моей процедуре (там клавиши вверх и вниз имеют другие коды)...
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
21.11.2009, 23:06
Цитата Сообщение от happyserge Посмотреть сообщение
эти коды отличаются от значений в моей процедуре (там клавиши вверх и вниз имеют другие коды)...
Да, эта таблица кодов виртуальных клавиш, подготовленная для обработки в оконных приложений.
А Вам может пригодится следующая программка:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <conio.h>
using namespace std;
 
int main()
{
  char ch;
  while(true) {
    printf("<<");
    ch = getche();
    if(ch == 27) break;                          
    if(ch != 0) printf("\r\n");
  }
  return 0;
}
Она демонстрирует, что же принимается по нажатию клавиши. И видно, что специальные клавиши принимаются в два приема...
Да что говорить, просто поэкспериментируйте с программкой...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2009, 23:06
Помогаю со студенческими работами здесь

PageDown + Enter, сочетание клавиш
Здравствуйте. Хочу что б при нажатии pageDown + Enter выводило окошко hello, только у меня не работает. var DOWN = 40; var ENTER =...

Как отследить нажатия клавиш?
Здорово перцы! Все действие происходит на WinAPI в VC6. У меня такая проблема: Я создаю таймер и отслеживаю нажатия клавиш Ctrl+V:...

Как имитировать нажатия клавиш
Вот например программа должна нажимать клавиши например: Q и подержать сек 5 потом W с подержать сек 8 и так далее

Как обрабатывать нажатия клавиш?
Надо обработать нажатие клавиши ESC в процессе работы функции VB. Что-то в хелпе только event нашел. Так это ж не в бэйсике...

Как имитировать нажатия клавиш
Знаю такое уже было, а именно тут: http://www.sql.ru/forum/932574/vb6-peredacha-storonnimu-oknu-nazhatie-klavishi Не знаю как...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru