C语言中的键盘处理程序

3
在C语言中,我该如何编写一个程序来告诉我哪些按键被按下了?例如,它应该输出:
You pressed F1 key
You pressed ESC key
You released F1 key

如果例如同时按下 F1 和 q 键,则将程序结束并返回 Linux 控制台。

我尝试过。

#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

我尝试了ncurses,但valgrind说我有一些内存泄漏,并且我的代码没有识别所有的键。 - Jaakko Seppälä
这个问题太过宽泛,除非你已经尝试过一些代码,否则你应该删除它或将其移动到程序员堆栈交换。如果你有代码,请将其编辑到问题中,以便我们可以看到你的进展情况。 - Vality
2个回答

0

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

要检测按键和释放事件,您需要深入了解以下内容:

  • Linux终端驱动程序的默认行为(所谓的“cooked”模式),它允许您一次读取一行字符,使用诸如getcscanf等函数,以及
  • 驱动程序的所谓“raw”模式,它将每个按下的键传递给您的应用程序,这是现代编辑器和shell所使用的,并由curses API提供。
通过查看输入事件实现此功能。请参见 input.h 头文件,相应文章,以及 使用示例。请注意,通过此 API 获取的是较低级别的信息:键扫描码,而不是 ASCII 或 Unicode 代码,并且获取的是按下键 (EV_KEY)、释放键(EV_REL) 事件,而不是按键动作。

0

你可以使用简单的scanf/printf轻松检测“经典”输入(字母、数字和符号)(你应该在UnicodeUTF-8编码中获取输入代码)。

对于“特殊”键:请看这里

似乎没有标准的方法来做到这一点,但是提供了一些第三方库的链接,希望能够帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接