c - C 中的键盘处理程序

标签 c linux keyboard

在 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

最佳答案

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

要检测按键按下和释放,您必须比

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

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

关于c - C 中的键盘处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138224/

相关文章:

c - 将数组传递给函数的语法

c++ - Windows - 从消息队列中删除与键盘相关的消息

c - 限制真实(固定/浮点)值的最快方法?

c - 使用 MPI_Isend 时出现段错误

c - 为什么 fcntl 在尝试解锁文件时从不返回错误?

linux - Bash whiptail 在更改目录时死掉

linux - Linux 内核中是否使用了扩展指令集(SSE、MMX)?

windows - 将 Win32 API WndProc Key 消息从一个窗口传输到另一个窗口

ios - 获取设备当前方向(应用扩展)

c - 从文件填充 Gtk 树存储