Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Обработка клавиатуры


Автор: Dexx 10.9.2007, 22:02
Как обработать нажатие кнопок на клаве в цикле

for (;;)
{


//case там и все дела


}


И при нажатии кнопки вызвать нужную процедуру!
Т.е. как узнать что нажата определенная кнопка
не важно скан код или аски! хоть что нибудь! smile 



Автор: zkv 10.9.2007, 22:13
консоль?
вспоминается что-то типа kbhit() + getch() из conio.h - мануал поможет.

Автор: fullnull 10.9.2007, 22:26
Код


int getch(); //код нажатой клавиши
int kbhit(); //проверяет состояние клавиатуры на нажатие клавиши

enum Keys { //Коды клавиш
     KEY_UP=(0x48),
     KEY_DOWN=(0x50),
     KEY_LEFT=(0x4B),
     KEY_RIGHT=(0x4D),
     
     KEY_ENTER=(0x0D),
     KEY_ESCAPE=(0x1B),
     KEY_SPACE=(0x20),
     KEY_TAB=(0x09),
     KEY_BACK=(0x08),
     KEY_DELETE=(0x53),
     
     KEY_HOME=(0x47),
     KEY_END=(0x4F),
     KEY_PAGE_UP=(0x49),
     KEY_PAGE_DOWN=(0x51),
     KEY_INSERT=(0x52),
     
     KEY_TILDE=(0x60),
     
     KEY_F1=(0x3B),
     KEY_F2=(0x3C),
     KEY_F3=(0x3D),
     KEY_F4=(0x3E),
     KEY_F5=(0x3F),
     KEY_F6=(0x40),
     KEY_F7=(0x41),
     KEY_F8=(0x42),
     KEY_F9=(0x43),
     KEY_F10=(0x44),
     KEY_F11=(0x85),
     KEY_F12=(0x86),
     
     KEY_NULL=0
};



Или еще если неизвестно, нажата клавиша или нет:


Код

int getKey(int time) //Ожидает нажатия клавиши время time, после чего возвращает управление
{
      for(int x=0; x<time; x++){
             if( kbhit() )
                    return getch();
     }
     return NULL;
}

Автор: georain 28.2.2008, 16:11
А (как||можно) сделать чтобы в ожидании
Код

 int kbhit();

поток засыпал?

Автор: georain 28.2.2008, 16:45
Думал, создавать ли новую тему, всё-же решил тут написать.

Как написать кроссплатформенное консольное приложение которое одновременно выводит информацию на экран и считывает ввод с клавиатуры, можно в одном, можно в разных потоках, но ввод и вывод не связан. Т.е. информация на экран выводится по таймеру, но в любой момент можно ввести команду. Отображать введённые символы очень желательно.
Я пока только додумался сделать в трёх потоках, один отображает блокируясь по таймеру, второй принимает буферизованный ввод блокируясь на cin, а третий всем этим управляет. Отображение сделал на cout'ах, поэтому введённые буквы затираются, да и честно говоря не уверен как на винде это будет выглядеть, пишу на линуксе. В общем товарищи, подскажите как это сделать правильно.

Добавлено @ 16:59
А
Код

conio.h

это стандартный файл c++? Это вроде только под виндовс.

Автор: georain 28.2.2008, 17:05
Есть вообще библиотеки по работе с вводом - выводом в консоль?

Автор: Alek86 28.2.2008, 17:35
Цитата(georain @  28.2.2008,  16:45 Найти цитируемый пост)
это стандартный файл c++? Это вроде только под виндовс.

конечно
С++ знать не знает ни о каких устройствах, тем более ввода-вывода


кстати и правда, есть ли библиотеки типа boost::filesystem, только для обработки нажатий клавиш и т.п.?

Автор: Mayk 28.2.2008, 18:02
Цитата(georain @  28.2.2008,  21:05 Найти цитируемый пост)
Есть вообще библиотеки по работе с вводом - выводом в консоль? 

Цитата(Alek86 @  28.2.2008,  21:35 Найти цитируемый пост)
кстати и правда, есть ли библиотеки типа boost::filesystem, только для обработки нажатий клавиш и т.п.? 

curses есть и под юнихи и вроде под винду(например, pdcurses). SLang есть под юникс, про винду не знаю -- не интересовался.

Автор: georain 28.2.2008, 18:53
Цитата(Alek86 @  28.2.2008,  17:35 Найти цитируемый пост)
конечно
С++ знать не знает ни о каких устройствах, тем более ввода-вывода

Чёт я у себя его не нашёл


Цитата(Mayk @  28.2.2008,  18:02 Найти цитируемый пост)
curses есть и под юнихи и вроде под винду(например, pdcurses). SLang есть под юникс, про винду не знаю -- не интересовался.

Интересуют именно кросплатформенные библиотеки.

Автор: Alek86 28.2.2008, 19:00
Цитата(georain @  28.2.2008,  18:53 Найти цитируемый пост)
Чёт я у себя его не нашёл

устройства ввода-вывода? )

клавиатура является одним из таких устройств...
и С++ о ней знать не знает
так что и стандартных файлов для ее порддержки быть не может

Автор: vinter 28.2.2008, 21:54
Цитата(georain @  28.2.2008,  19:53 Найти цитируемый пост)
Чёт я у себя его не нашёл

это борландовский хидер, вроде в версиях старше 3.1 conio.h вообще нет..

Автор: georain 29.2.2008, 03:07
А есть кроссплатформ библиотека для перехвата нажатий на клавиши, что-то типа небуферизованного ввода?

Автор: Mayk 29.2.2008, 06:21
Цитата(georain @  28.2.2008,  22:53 Найти цитируемый пост)
Интересуют именно кросплатформенные библиотеки. 

Read the fucking manual.
Цитата

PDCurses is a public domain curses library for DOS, 
OS/2, Win32, X11 and SDL, implementing most of the functions available 
in X/Open and System V R4 curses. It supports many compilers for these 
platforms. The X11 port lets you recompile existing text-mode curses 
programs to produce native X11 applications.


Автор: georain 29.2.2008, 10:49
Цитата(Mayk @  29.2.2008,  06:21 Найти цитируемый пост)
PDCurses

Это ответ на все вопросы в данном топике, спасибо!

Автор: DIHOST 4.3.2008, 20:17
Мегасофтина - консольный пробник клавы... хотя надо-бы наизусть знать таблицу.
Код

#pragma hdrstop
#include <iostream.h>
#include <conio.h>

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
   int a;
   do
   {
   a = getch();
   cout << a << endl;
   }
   while (a != 3);   // выход из цикла и завершение работы мегасофтины при нажатии Ctrl+С
   return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)