在 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”模式),它允许您使用
getc
和scanf 等函数一次读取一行字符
,还有 - 驱动程序所谓的“原始”模式,它向您的应用程序提供按下的每个键,由现代编辑器和 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/