【问题标题】:getch() of ncurses doesn't workncurses 的 getch() 不起作用
【发布时间】:2011-12-17 16:43:59
【问题描述】:

我需要为我的程序创建一个主循环并编写以下函数:

void menu(){
int ch;
cbreak();
noecho();
initscr();
refresh();
while (ch != KEY_F(9)){
    ch = getch();
    cout << ch << endl;
    switch (ch){
        case KEY_F(1): add();
            break;

        case KEY_F(2): edit();
            break;

        case KEY_F(3):
            break;

        case KEY_F(4):
            break;


    }

}

endwin();

}

但是 getch() 不起作用并在循环中打印 -1。我怎样做? 我可以设置特殊的 attr 或调用特殊的 func 吗?

【问题讨论】:

    标签: linux key ncurses getch


    【解决方案1】:

    您需要致电keypad(),例如keypad(stdscr, TRUE)。但除此之外,功能键可能无法在您的终端上使用。检查您的 ncurses.h 文件中的 has_key() 函数,您可以使用它来确定它们是否在您的终端上可用。

    【讨论】:

    • 对 cbreak() 和 noecho() 的调用也应该在对 initscr() 的调用之后。
    • 我解决了,在 initscr() 之后我应该调用 cbreak 然后 keypad() 然后 getch() 正常工作。谢谢。
    【解决方案2】:

    首先,每个 ncurses 函数只能在调用 initscr() 之后使用。在您的代码中,cbreak()noecho() 可能会被忽略。
    其次,如果你想使用function keys,你必须通过调用keypad(stdscr, TRUE) 告诉ncurses。但是,由于并非每台计算机都有功能键,因此您应该始终使用has_key()(检查当前终端是否支持颜色的has_colors())检查系统是否支持该功能。

    【讨论】:

      【解决方案3】:

      是的,我的循环在这里:

      initscr();
      clear();
      noecho();
      cbreak();   /* Line buffering disabled. pass on everything */
      startx = (80 - WIDTH) / 2;
      starty = (24 - HEIGHT) / 2;
      
      
      menu_win = newwin(HEIGHT, WIDTH, starty, startx);
      keypad(menu_win, TRUE);
      mvprintw(0, 0, "Name of my program");
      refresh();
      print_menu(menu_win, highlight);
      while (true)
      
          {   c = wgetch(menu_win);
              switch(c){
      TYPE OF KEYS;
      }//END OF SWITCH
      }//END OF LOOP
      

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多