【问题标题】:Ncurses: Detecting if F1 key pressed and using signalsNcurses:检测是否按下 F1 键并使用信号
【发布时间】:2011-10-12 12:27:43
【问题描述】:

我正在尝试学习 ncurses 库,我想出了以下代码:

#include <ncurses.h>
#include <stdlib.h>
#include <signal.h>

static void finish(int sig);

int main(int argc, char** argv) {

    char c;
    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */

    printw("Type any character to see it in bold:\n");
    refresh();
    c = getch();

    /* work around for ctrl+c */
    if(c == 3)
        finish(0);

    while(c != KEY_F(1))
    {
        printw("The pressed key is ");
        attron(A_BOLD);
        printw("%c\n", c);
        attroff(A_BOLD);
        refresh();
        c = getch();

        /* work around for ctrl+c */
        if(c == 3)
            finish(0);

        printf("Code = %d\n", c);
    }

    printw("F1 key pressed.\n");
    endwin();

    return (EXIT_SUCCESS);
}

static void finish(int sig)
{
    endwin();

    /* do your non-curses wrapup here */

    exit(0);
}

此代码中的问题是当我按下 F1 键时,终端帮助窗口打开,我无法捕捉 F1 键按下。我也无法通过信号机制捕捉 ctrl+c 按下。有什么方法可以覆盖终端上的 F1 键以及如何在诅咒模式下使用信号。

【问题讨论】:

    标签: c ubuntu terminal ncurses signal-handling


    【解决方案1】:

    在终端窗口的菜单栏中,编辑 -> 首选项。转到快捷方式选项卡。清除冲突的快捷方式。

    更好的是,不要使用与终端仿真器预先存在的快捷方式冲突的任何快捷方式。

    您可能应该不理会 SIGINT。 ncurses 已经在退出前拦截它以清理终端。如果您需要自己运行一些清理代码,请尝试使用atexit 函数。

    【讨论】:

    • atexit() 函数实际上不是我正在寻找的。我想用 ctrl+c 中断并结束我的 promram。所以我仍然需要 SIGINT,你知道任何解决方案吗?
    • 注释掉你对raw函数的调用。这会拦截 ctrl-c。没有它,ctrl-c正常中断程序,调用atexit注册的函数。
    • KEY_F(1) 宏返回 265,但当我按下 F1 时,变量 c 的值为 9。
    • 您已将 c 定义为 char,但 265 太大而无法存储在 char 中。将其定义为int。在确定它是否真的是一个角色之后,你可以将它转换为一个角色。
    • 谢谢,在你写之前我已经注意到了。
    【解决方案2】:

    我在c / c++ 都有解决方案

    inline void signal_callback_handler(int signum){signal(SIGINT, signal_callback_handler);}
    

    将其设为全局

    拨打下方电话main()

    signal(SIGINT, signal_callback_handler);
    

    不要忘记包含stdio.hsignal.h

    【讨论】:

    • 我发现在我的答案中包含工作代码和解释很有帮助。在我看来,您的回答不是很清楚,可以使用一些格式和额外的细节。
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2021-07-14
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多