C中的键盘处理程序

时间:2014-08-05 11:56:02

标签: c linux keyboard

在C中,如何编写一个程序来告诉我按下了哪些键?例如,它应该输出

You pressed F1 key
You pressed ESC key
You released F1 key

到Linux控制台并结束程序,例如,如果按下F1和q键,则结束程序。

我试过

#include <curses.h>  // required

int r,c,  // current row and column (upper-left is (0,0))
    nrows,  // number of rows in window
    ncols;  // number of columns in window

void draw(char dc)

{  move(r,c);  // curses call to move cursor to row r, column c
   delch();  insch(dc);  // curses calls to replace character under cursor by dc
   refresh();  // curses call to update screen
   r++;  // go to next row
   // check for need to shift right or wrap around
   if (r == nrows)  {
      r = 0;
      c++;
      if (c == ncols) c = 0;
   }
}

main()

{  int i;  char d;
   WINDOW *wnd;

   wnd = initscr();  // curses call to initialize window
   cbreak();  // curses call to set no waiting for Enter key
   noecho();  // curses call to set no echoing
   getmaxyx(wnd,nrows,ncols);  // curses call to find size of window
   clear();  // curses call to clear screen, send cursor to position (0,0)
   refresh();  // curses call to implement all changes since last refresh

   r = 0; c = 0;
   while (1)  {
      d = getch();  // curses call to input from keyboard
      if (d == 'q') break;  // quit?
      draw(d);  // draw the character
   }

   endwin();  // curses call to restore the original window and leave

}

但它存在问题,例如识别shift键和valgrind说

==11693==    still reachable: 59,676 bytes in 97 blocks

2 个答案:

答案 0 :(得分:0)

您可以使用简单的scanf / printf轻松检测“经典”输入(字母,数字和符号)(您应该在Unicode中获取输入代码,{{ 3}}编码)。

对于“特殊”键:看看UTF-8

似乎没有标准的方法可以做到这一点,但有些链接会提供给第三方库,希望能提供帮助。

答案 1 :(得分:0)

首先,请注意,这不是C问题;答案是特定于Linux的。 C语言不提供键盘API。

要检测按键和释放,您必须深入

  • Linux终端驱动程序的默认行为(所谓的“熟”模式),它允许您使用getcscanf等函数一次读取一行字符,以及
  • 驱动程序的所谓“原始”模式,它为您的应用程序提供按下的每个键,由现代编辑器和shell使用,并由curses API提供。

您可以通过查看输入事件来做到这一点。请参阅标题input.hcorresponding articlean example of its use。请注意,通过此API,您可以获得较低级别的信息:密钥扫描代码,而不是ASCII或Unicode代码,以及按键(EV_KEY),键入(EV_REL)事件,而不是按键。