如果没有initscr,getch就无法工作

时间:2015-08-10 17:45:07

标签: ncurses getch

我经历了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();
}

3 个答案:

答案 0 :(得分:2)

getchwgetch(stdscr)相同。它假定屏幕已初始化。 ncurses(任何curses实现)必须做一些事情才能使wgetch可用:

  • 阅读终端说明
  • 初始化终端I / O模式
  • 分配一个屏幕进行绘制。

最后一个是因为wgetch在执行读取之前在调用它的窗口上执行wrefresh

您可以将newtermfilter一起使用,以避免清除屏幕并执行面向行的输入。 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来正确设置此序列。