在linux c应用程序中创建自定义键盘快捷键

时间:2012-06-11 09:57:21

标签: c linux keyboard shortcuts

我正在尝试处理键盘快捷键,我已经知道如何使用信号,但问题是信号列表没有提供很多选择。 所以我想知道是否可以处理像 CTRL +'key'这样的快捷方式 key可以是任何键盘键,如A Z E R T Y

1 个答案:

答案 0 :(得分:0)

以下是使用GNU readline的示例。您可以捕获关键序列 Ctrl + P Ctrl + G 等。

int keyPressed(int count, int key) {

        printf("key pressed: %d\n",key);
        rl_on_new_line();
        return 0;
}

int main() {
        rl_catch_signals = 0;
        rl_bind_keyseq("\\C-g",keyPressed);
        rl_bind_keyseq("\\C-p",keyPressed);
        rl_bind_keyseq("\\C-z",keyPressed);

        while(1) {
                char *line = readline("rl> ");
        }

对于special characters,例如信号字符, Ctrl + C Ctrl + Z ,您需要rl_catch_signals=0。这样,您就可以定义自己的信号处理程序。

我发现有一件事是,即使您在调用rl_bind_keyseq("\\C-z",keyPressed)之前将终端设置为raw模式,也不会调用readline。相反,终端仍将 Ctrl + Z 解释为SIGTSTP

查看源代码,显然每次调用readline()时,终端设置为reset

//rltty.c
    #if defined (HANDLE_SIGNALS)
      tiop->c_lflag &= ~ISIG;
    #else
      tiop->c_lflag |= ISIG;
    #endif

除非你想修改readline,否则我建议为特殊字符定义信号处理程序。