The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Как программировать клавиатуру? (keyboard terminal scancode curses )


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: keyboard, terminal, scancode, curses,  (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _ From : Dmitry Kravtsov 2:5020/1101.74 06 Sep 97 11:58:56 Subj : Re: Как программировать клавиатуру? ________________________________________________________________________________ Hello All! 04 Sep 97 12:44, Alexander E. Tcherenkov (2:50/128@fidonet) wrote to All: AET> Dmitry Kishchukov wrote: >> Кто подскажет как мне на C/C++ попроще сделать две простые вещи: >> 1. Узнать есть ли нажатые клавиши? >> 2. Взять код нажатой клавиши (сразу а не после нажатия "Enter") AET> см. man curs_getch функции getch,wgetch ,... AET> но надо будет использовать curses. AET> Если создашь класс в дальнейшем это будет AET> действительно просто... Если нет особой необходимости связываться с ncurses, то можно этого не делать, а почитать man termios () === Cut === #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <sys/ioctl.h> ... struct termio tstdin; fd_set mask; ... /* Set stdin (file descriptor=0) to raw mode, no echo */ ioctl(0, TCGETA, &tstdin); tstdin.c_lflag &= ~(ICANON|ECHO); ioctl(0, TCSETA, &tstdin); === Cut === WMBR :), Dmitry AKA kravtsov@falt.deep.ru --- * Origin: MIPTh, DAFT (2:5020/1101.74) _ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _ From : Victor Vislobokov 2:5054/8.34 19 May 97 23:43:38 Subj : GNUc ________________________________________________________________________________ Hello NMi. Держи маленьки примерчик, который ждет нажатия клавиши и затем выдает код клавиши (не для клавиш вырабатывающих несколько кодов). Выход по нажатию Enter. === probe.c === #include<stdio.h> #include<curses.h> main() { int c; initscr(); cbreak(); noecho(); do { c=getch(); printw("%d",c); refresh(); } while(c!=10); endwin(); return 0; } === Cut === А вот как это компилить: === Makefile === probe: probe.o g++ -m486 -o probe probe.o -lncurses probe.o: probe.c g++ -c probe.c === Cut === Victor --- xMail/beta * Origin: (2:5054/8.34) _ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _ From : Leonid Broukhis 2:5020/400 16 May 97 08:11:10 Subj : Как пpочитать с клавиатypы символ ? ________________________________________________________________________________ From: leob@asylum.mailcom.com (Leonid Broukhis) On Fri, 16 May 97 00:21:40 +0400, NMi iNtERCEPtOR wrote: >Еще вопpос - faq, навеpное... всю жизнь под дос/bcpp кодил. >Как пpочитать с клавиатypы символ ? В смысле - "c=???();", нажимаем бyквy 'a' и >полyчаем c=69, и т.п. (стpелки, ...) > >Уже все пеpепpобовал - getch, getc, getchar, read(fileno(stdin),c,1),... =(( > >Еще пpоблема - когда делаю #include <curses.h> - не видит "stdscr","wgetch()". >Hасколько я понимаю, нyжно пpилинковать /lib/libncurses.so ? Как ? Если тебе нужен только небуферизованный ввод с клавиатуры, а рисование на экране не нужно, то system("stty -icanon min 1"); тебя устроит. (В конце программы нужно поставить system("stty icanon");) После этого делаешь stdin небуферизованным setbuf(stdin, NULL); и читаешь getchar'ом. Leo --- ifmail v.2.9 * Origin: Demos online service (2:5020/400@fidonet) _ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _ From : Oleg Machulski 2:5020/623.20 16 May 97 17:13:28 Subj : Re: GNUc ; Console/terminal keyboard access ________________________________________________________________________________ Hello NMi! 16 Май 97, NMi iNtERCEPtOR писа[л|ла] к All: Ni> Еще вопpос - faq, навеpное... по-моему еще не faq, хотя я похожий вопpос как-то задавал. Ni> всю жизнь под дос/bcpp кодил. bcpp - мастдай, watcom - pулез Ni> Как пpочитать с клавиатypы символ ? В смысле - "c=???();", нажимаем Ni> бyквy может пpимеp и избыточен, но пpимеpно в таком виде это пpисутствует в joe. (пpактически было оттуда выдpано) а если скан-кодов хочешь, то в RAW клавиатуpу надо пеpеводить. СУПЕРВОПРОС: какой комбинацией кнопок клавиатуpу из RAW выводят??? === Cut === #include <stdio.h> #include <fcntl.h> #include <sys/termios.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> void main(){ int termin; int havec; struct termios oldterm; struct termios newterm; termin=open("/dev/tty",O_RDONLY); tcgetattr(termin,&oldterm); tcgetattr(termin,&newterm); newterm.c_lflag=0; newterm.c_iflag&=~(ICRNL|IGNCR|INLCR|IXON|IXOFF); newterm.c_oflag=0; newterm.c_cc[VMIN]=1; newterm.c_cc[VTIME]=0; tcsetattr(termin,TCSADRAIN,&newterm); fcntl(termin, F_SETFL, O_NDELAY); while(havec!=0x20){ if(read(termin,&havec,1)==1) { printf("[%x]", havec); fflush(stdout); } } tcsetattr(termin,TCSADRAIN,&oldterm); fcntl(termin, F_SETFL, 0); } === Cut === Ni> 'a' и полyчаем c=69, и т.п. (стpелки, ...) где это у тебя 'a'=69??? 'a'=То ли 0x61 то ли 0x41 Ni> Уже все пеpепpобовал - getch, getc, getchar, Ni> read(fileno(stdin),c,1),... Ni> =(( естественно все эти падлы ждут нажатия enter, да??? неудивительно. консоль же у тебя и печатной машинкой consul может быть :) кстати очевидно, что вся еpунда типа стpелок, пэйджапов и эфодинов пpиходит как ескейппоследовательности. With best regards, Oleg. --- user_defined_warning UNREG * Origin: powered by Linux (FidoNet 2:5020/623.20) _ RU.UNIX.BSD (2:5077/15.22) _____________________________________ RU.UNIX.BSD _ From : Ivan Pascal 2:5020/400 11 Sep 98 12:35:14 Subj : Re: траблы + Re: сканкоды ________________________________________________________________________________ From: Ivan Pascal <pascal@tsu.ru> Valentin Davydov wrote: > > > From: Ivan Pascal <pascal@tsu.ru> > > Date: 9 Sep 1998 13:48:02 +0400 > > > >#include <machine/console.h> > >#include <ncurses.h> > > > >main() > >{ char c; > > > > initscr(); savetty(); raw(); noecho(); > > if (ioctl(0, KDSKBMODE, K_CODE) < 0) perror(0); > > > > do { > > c = getchar(); > > if (c > 0) printf("%d\n\r", c); > > } while (c != 1); > > > > if (ioctl(0, KDSKBMODE, K_XLATE) < 0) perror(0); > > resetty(); > > > > exit(); > >} > > Большое спасибо! Только не K_CODE, а K_RAW, наверное. Это зависит от того, что вы хотите :-) C K_RAW она вам будет отдавать "сырые" скан-коды. То есть, "код нажатия"/"код отжатия" и к тому же, некоторые клавиши генерят целую последовательность кодов. А то, что указывется в keymap в первой колонке, это уже не "сырые" коды, а внутренние коды syscons. Они отличаются тем, что для простых клавиш берется только "код нажатия", а "расширенные" коды он просто заменяет на однобайтные (те, которые еще не заняты простыми клавишами). Так вот, K_KODE - это отдавать эти внутренние коды. То есть, если вам нужны коды кнопок, чтобы потом "навесить" на них что-нибудь полезное через keymap, то лучше K_KODE. > Вал. Дав. P.S. кстати, для "сырых" кодов программку надо подправить - убрать проверку (c > 0), или сделать c - unsigned char -- ----- Ivan Pascal | pascal@tsu.ru Administrator of | Tomsk State University. university network | Tomsk. Russia. --- ifmail v.2.14dev2 * Origin: Tomsk State University (2:5020/400@fidonet)

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, Аноним (1), 20:58, 02/04/2002 [ответить]  
  • +/
    Класс!
    очень помогло.
    а curses.h с getch() посылайте подальще
     
  • 2, funt (?), 05:19, 20/06/2002 [ответить]  
  • +/
    А можно сделать так: получать ASCII но при этом проверять : нажатие alt,shift,ctrl?
    и ещё как scancod в ascii переводить?
     
  • 3, Alex (?), 12:50, 27/08/2003 [ответить]  
  • +/
    А как, скажите, определять одновременное нажатие нескольких буквенных или цифровых клавиш? Спасибо
     
  • 4, pascalik.ru (?), 14:27, 06/01/2010 [ответить]  
  • +/
    Отлично!
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру