我经历了NCURSES的Documentation。如果我在没有initscr的情况下使用getch那么我没有得到它,那么为什么这个程序不起作用。是否有其他方法可以在没有清除屏幕的情况下输入箭头键(这样做)。
#include <ncurses.h>
#include <unistd.h>
int main()
{
int ch;
//initscr();
//raw();
//keypad(stdscr, TRUE);
//noecho();
while(1)
{
ch = getch();
switch(ch)
{
case KEY_UP:
printw("\nUp Arrow");
break;
case KEY_DOWN:
printw("\nDown Arrow");
break;
case KEY_LEFT:
printw("\nLeft Arrow");
break;
case KEY_RIGHT:
printw("\nRight Arrow");
break;
}
if(ch == KEY_UP)
break;
}
//endwin();
}
答案 0 :(得分:2)
getch
与wgetch(stdscr)
相同。它假定屏幕已初始化。 ncurses(任何curses实现)必须做一些事情才能使wgetch
可用:
最后一个是因为wgetch
在执行读取之前在调用它的窗口上执行wrefresh
。
您可以将newterm与filter
一起使用,以避免清除屏幕并执行面向行的输入。 ncurses-examples中的filter
计划演示了如何执行此操作。
答案 1 :(得分:1)
或者,您可以使用tcsetattr
中的termios
更改终端属性。如果你在canonical mode
(需要开始流程的新行)和non-canonocal mode
之间循环(Keypress绰绰有余)。
以下程序的工作原理如下:进程等待用户输入。如果按下向上箭头键,则会打印“箭头键按下”并退出。如果按下其他内容,它会等待用户按Enter
然后打印用户inpu。打印输入后退出。
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
struct termios oldt, newt;
char ch, command[20];
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
while(1)
{
ch = getchar();
if (ch == '\033')
{ printf("Arrow key\n"); ch=-1; break;}
else if(ch == -1) // by default the function returns -1, as it is non blocking
{
continue;
}
else
{
break;
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch,stdin);ith
putchar(ch);
scanf("%s",command);
printf("\n%s\n",command);
return 1;
}
return 0;
}
答案 2 :(得分:0)
我有一个没有ncurses的解决方案
您可以像这样使用simple-getch:
t_key keys[] = {
{"[A", K_UP},
{"[B", K_DOWN},
{"[D", K_LEFT},
{"[C", K_RIGHT},
{NULL, K_UNK},
};
int key;
ch_init();
while ((key = ch_get(keys)) != K_BACK)
{
printf("%d\n", key);
}
ch_end();
keys
数组是将使用的转义序列列表(当您在终端中键入箭头键时,它将写入一个转义键,后跟多个字符来定义键。)
此序列可能/将在终端之间发生变化,您应该使用termcap来正确设置此序列。