在 ncurses 中捕获 control+key 的正确方法

2023-11-26

在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示:

#define ctl(x) ((x) & 0x1f)

它工作正常,但问题是我无法同时捕获 C-j 和 ENTER,这是因为:

   j = 106 = 1101010
0x1f = 31 = 0011111
1101010 & 0011111 = 0001010 = 10 = ENTER key..

那么..我该如何抓住它? 谢谢!

-- 编辑: 如果我尝试下面的代码, 我无法正确捕捉回车键,即使在数字键盘中也是如此。 Enter 被捕获为 ctrl-j。

#include <stdio.h>
#include <ncurses.h>
#define ctrl(x) ((x) & 0x1f)

int main(void) {
    initscr();
    int c = getch();
    nonl();
    switch (c) {
        case KEY_ENTER:
            printw("key: %c", c);
            break;
        case ctrl('j'):
            printw("key: ctrl j");
            break;
    }
    getch();
    endwin();
    return;
}

新代码:

#include <stdio.h>
#include <ncurses.h>
#define ctrl(x)           ((x) & 0x1f)

int main(void) {
    initscr();
    int l = -1;
    int c = getch();
    cbreak();
    noecho();
    nonl();
    keypad(stdscr, TRUE);
    switch (c) {
        case KEY_ENTER:
            printw("key: %c", c);
            break;
        case ctrl('j'):
            printw("key: ctrl j");
            break;
    }
    printw("\nnow press a key to end");
    getch();
    endwin();
    return;
}

Try nonl:

The nl and nonl例程控制是否底层显示设备 在输入时将返回键转换为换行符,以及是否在输出时将换行符转换为返回和换行(在任何一种情况下,call addch('\n')相当于回车和换行 虚拟屏幕)。最初,这些翻译确实发生了。如果您使用 nonl 禁用它们,curses 将能够更好地利用 换行功能,导致光标移动更快。还有咒骂 然后就能够检测到返回键。

延伸阅读:注释部分 of the getch手册页:

通常,KEY_ENTER 表示按 Enter 键发送的字符 数字键盘:

  • 终端描述列出了最有用的键,
  • 普通键盘上的 Enter 键已经由 用于回车和换行的标准 ASCII 字符,
  • 根据是否调用了 nl 或 nonl,按“Enter”键 常规键盘可能会返回回车符或换行符, 最后

  • “输入或发送”是该键的标准描述。

这解决了有关换行符/回车符翻译的问题。后续评论是提醒您指出手册页在以下内容中提供了基本建议初始化部分:

为了获得一次字符输入而不回显(最具交互性, 面向屏幕的程序需要这个),以下顺序应该是 用过的:

     initscr(); cbreak(); noecho();

并且OP的示例程序没有使用cbreak (or raw)。的手册页cbreak says

通常,tty 驱动程序会缓冲键入的字符,直到出现换行符或 键入回车。这cbreak例程禁用行缓冲 并擦除/终止字符处理(中断和流程控制字符不受影响),使用户立即键入字符 可供程序使用。这nocbreak例程将终端返回到 正常(煮熟)模式。

最初,终端可能处于也可能不处于 cbreak 模式,因为该模式是 遗传;因此,程序应该调用cbreak or nocbreak明确地。大多数使用curses的交互程序都会设置cbreak模式。 注意cbreak覆盖raw. (See curs_getch(3x)进行讨论 这些例程如何与echo and noecho.)

另外,在curs_getch你可以读

If keypad为 TRUE,并且按下了功能键,该功能的标记 返回功能键而不是原始字符:

  • 预定义的功能键列于<curses.h>作为宏 值超出 8 位字符范围。他们的名字开头为KEY_.

也就是说,诅咒只会回归KEY_ENTER如果程序调用keypad:

keypad(stdscr, TRUE);

为了方便讨论,下面是一个修复示例程序截至 5 月 17 日的一些问题的示例:

#include <stdio.h>
#include <ncurses.h>
#define ctrl(x)           ((x) & 0x1f)

int
main(void)
{
    int c;
    initscr();
    keypad(stdscr, TRUE);
    cbreak();
    noecho();
    nonl();
    c = getch();
    switch (c) {
    case KEY_ENTER:
        printw("\nkey_enter: %d", c);
        break;
    case ctrl('j'):
        printw("\nkey: ctrl j");
        break;
    default:
        printw("\nkeyname: %d = %s\n", c, keyname(c));
        break;
    }
    printw("\nnow press a key to end");
    getch();
    endwin();
    return 0;
}

也就是说,你必须调用keypad before getch,以及返回的值KEY_ENTER不是一个字符(它不能用%c).

Running on the Linux console with the usual terminal description, you will see only carriage return for the numeric keypad Enter, because that description does not use application mode. Linux console does support application mode, and a corresponding description could be written. As a quick check (there are differences...) you could set TERM=vt100 to see the KEY_ENTER.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ncurses 中捕获 control+key 的正确方法 的相关文章

  • E: 无法定位软件包 ncurses 问题解决

    在编译Linux内核 xff08 make menuconfig xff09 之前 xff0c 我们需要安装ncurses xff0c 但是安装过程中提示 xff1a E 无法定位软件包 ncurses 解决办法 xff1a 系统可能识别不
  • 什么机制允许 ViM 暂时覆盖整个控制台?

    当你进入vim 它 清除 屏幕 退出后 它会 恢复 原始内容 我知道可以使用 x1b 2J清除控制台并重置光标位置 但这将覆盖终端内容 我假设 Vim 使用ncurses在幕后 我想更好的问题是 ncurses 如何做到这一点 但它是如何完
  • 如何将该程序从 conio 移植到curses?

    我在 Windows 上编写了这个简单的程序 由于Windows有conio 所以它工作得很好 include
  • 对“initscr”Ncurses 的未定义引用

    我正在尝试编译我的项目并使用 lib ncurse 当编译器链接文件时我遇到了一些错误 这是我在 Makefile 中的标志行 W Wall Werror Wextra lncurses 我已经包含了 ncurses h 一些布局 prom
  • ncurses:奇怪的行格式

    我有这个代码可以与 ncurses 一起使用 include
  • ncurses 和 stdin 阻塞

    I have stdin in a select set and I want to take a string from stdin whenever the user types it and hits Enter But select
  • 如何构建支持超过 223 列鼠标输入的 Curses 程序

    我正在尝试让一个curses程序与我的终端跨显示器一起工作 但是 x 坐标无法移过第 223 列 而是循环移动 在源代码中 这似乎是因为它们被定义为 8 位 并且位置值仅在前 32 个值之后开始 即 x raw x 这是一个示例程序http
  • 无法编译使用 ncurses 的 C/C++ 代码 [重复]

    这个问题在这里已经有答案了 我刚刚发现 ncurses 并且刚刚开始学习它 但是我的教程中的示例无法在我的计算机上编译 我必须手动安装 ncurses 并通过输入 apt get install libncurses5 dev libncu
  • CMake 不链接 ncurses

    我对 CMake 完全是菜鸟 我的CMakeLists txt非常基本 cmake minimum required VERSION 2 4 6 set the default path for built executables to t
  • Python3 + Curses:如何按“q”立即结束程序?

    当我运行以下示例代码并按 q 时 它会正常结束 但是如果我按任何其他字符 例如许多中断和许多其他字符 然后按 q 它不会退出 我该如何解决这个问题 import curses time def main sc sc nodelay 1 wh
  • 哪些 ncurses 框架可用于 BASH? [复制]

    这个问题在这里已经有答案了 是否还有更多适用于 bash 的文本用户界面 TUI 框架 除此之外 http code google com p bashsimplecurses http code google com p bashsimp
  • 使用 ncurses 在 Linux 中构建 HelloWorld C++ 程序

    我成功跑了sudo apt get install libncurses5 dev 然后在我的 Eclipse 窗口中尝试构建以下内容HelloWord cpp程序 include
  • 在Python中使用curses和raw_input

    在我的Python Linux控制台应用程序中 我使用curses来处理数据的显示 同时 我希望有一个输入行来输入命令 几乎是良好的 ol irssi 风格 使用默认的curses getch 我必须做大量的编码才能获得raw input函
  • 从 ruby​​-ncurses 中获取 256 种颜色

    我的终端有 256 种颜色 效果很好 测试脚本在这里 http www frexx de xterm 256 notes 但是当我使用 ncurses 通过 Ruby ncurses 时它停止工作 打印该页面上给出的转义序列工作正常 但是当
  • 当终端大小调整时,Ncurses 程序退出

    当我调整终端窗口大小时 以下程序退出 为什么以及如何阻止它 include
  • 如何更改“go build”的库路径

    我正在尝试与 goncurses 一起工作 在 Centos 6 上 ncurses 库很旧 5 7 想要 5 9 所以我从源代码构建了 ncurses 并将其安装到 usr lib usr include 等中 如何告诉 go get 针
  • 如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • python 中的 (n)curses pad 不工作

    我似乎无法让 ncurses pad 在 python 2 6 2 7 和 3 2 中工作 直接使用代码http docs python org howto curses html http docs python org howto cu

随机推荐

  • 如何更改 Apache FOP Xalan XSLT 处理器?

    我正在使用 Apache FOP 1 1 我想将当前的 apache Xalan XSLT 处理器更改为其他处理器以支持 XSLT 2 0 目前它不支持 XSLT 2 0 请帮助我如何解决这个问题 谢谢 我得到了答案 Transformer
  • 将循环的每次迭代延迟一定时间

    JSFiddle http jsfiddle net KH8Gf 27 Code document ready function expand click function var qty qty val for var counter 0
  • sigma.js 不读取 JSON

    我有这个页面 div div
  • magento 显示类别中的产品数量错误

    我有一个奇怪的问题 似乎很多人在互联网上都有同样的问题 下图将定义我的问题 而且我的 magento 版本是 1 7 正如我所强调的 LEFT 表示该类别有 16 个产品 但实际上 类别产品 选项卡显示 15 个产品 我所有的分类都乱了 请
  • EWS 获取所有文件夹中未读电子邮件的计数

    我正在尝试从 Exchange 获取特定用户的未读电子邮件数量 我可以从收件箱获取电子邮件数量 如下所示 SearchFilter sf new SearchFilter SearchFilterCollection LogicalOper
  • sp_send_dbmail不会发送查询结果

    我已经尝试了每个该死的论坛建议的所有途径 但无济于事 需要发送已存储在表中的 SQLPERF logspace 结果 通过sp send dbmail给收件人 作业的第 2 步是发生故障的地方 请帮忙 EXEC msdb dbo sp se
  • Firebase 身份验证 iOS 12 无效令牌

    我有一个使用 Firebase 身份验证的应用程序 该身份验证使用电话短信验证和验证码 无 APNS 如果您使用的是 iOS 11 4 1 该应用程序可以在身份验证过程中正常运行 但是 如果您使用的是 iOS 12 则身份验证过程会导致无效
  • Iframe 中的会话在 Firefox 中工作,但在 Internet Explorer 中不工作

    我正在尝试让表单在 Internet Explorer 中工作 我发现当我在 Firefox 中提交此表单时 我可以启动一个会话并根据该会话将我的网络浏览器发送到正确的页面 然而 在 Internet Explorer 中 当我调试 SES
  • Android中如何设置按钮点击效果?

    在Android中 当我为按钮设置背景图像时 单击它时看不到任何效果 我需要在按钮上设置一些效果 以便用户可以识别出该按钮被单击 单击该按钮后 该按钮应变暗几秒钟 这个怎么做 这可以通过创建一个包含按钮状态列表的可绘制 xml 文件来实现
  • 箭头函数内的 async/await (Array#map/filter)

    我在此代码中遇到编译时错误 const someFunction async myArray gt return myArray map myValue gt return id my id myValue await service ge
  • 角度路由 - 重定向到外部站点?

    在 AngularJS 路由文件中 有一个选项otherwise路由 替换 404 routeProvider when otherwise redirectTo my path 有没有办法做到这一点 以便重定向到不在应用程序中的页面 我试
  • 保持终端焦点

    我有一个 python 脚本 它使用 selenium 来自动化网页 将焦点从需要用户输入的终端上移开 python 中是否有以编程方式将焦点切换回终端的方法 如果重要的话 我将在 Windows 7 上的 Windows 命令提示符中运行
  • 长周期区块应用

    我的应用程序中有以下循环 var maxIterations Int 0 func calculatePoint cn Complex gt Int let threshold Double 2 var z Complex init re
  • const 的用处 (C++)

    我是一个 const 恶魔 我努力让一切尽可能 const 我尝试查看 const 和非 const 版本函数的各种反汇编输出 但尚未看到明显的改进 我假设现在的编译器能够使用非 const 函数来完成聪明的事情 而这些函数在技术上可能是
  • 从长到宽,重复两次测量

    我知道这个问题已经在 从长到宽 的标题下被问过很多次了 但我遇到了一种情况 我有两个重复测量的值变量 id sex time score1 score2 1 subject 1 m Time1 0 20926263 0 2499310 2
  • winutils.exe chmod 命令未设置权限

    gt D gt echo HADOOP HOME gt D Apps winutils hadoop 2 7 1 在与 HADOOP HOME 相同的磁盘上创建 tmp hive 文件夹 D gt dir tmp hive Director
  • 为什么 Jetpack Compose Preview 不显示任何内容?

    我正在使用 Jetpack Compose 预览仅显示标题 但如果我使用 dev13 版本 它工作正常 IDE Android Studio 4 2 Canary 7撰写 0 1 0 dev17 这是一个已知问题 它应该在 Android
  • Django 管理,自定义错误消息?

    我想知道如何在 Django 管理中显示错误消息 我的网站上有一个私人用户部分 用户可以在其中使用 点 创建请求 一个请求从用户的帐户中获取 1 或 2 个积分 取决于请求的两种类型 因此如果帐户有 0 个积分 则用户无法发出任何请求 在私
  • 无法加载文件或程序集“xxxx”或其依赖项之一。该系统找不到指定的文件

    在 VS2005 中 我们整个编程人员都收到此错误消息零星地它总是在贝尼控制项目 此错误消息每天会发生多次 并且在进入控件的设计模式时会发生 通常重建贝尼控制解决了问题 但有时必须重建整个解决方案 还有其他人解决了这个问题吗 有哪些建议或网
  • 在 ncurses 中捕获 control+key 的正确方法

    在 ncurses 中捕获 control key 的正确方法是什么 当前我正在这样做定义控制 如下所示 define ctl x x 0x1f 它工作正常 但问题是我无法同时捕获 C j 和 ENTER 这是因为 j 106 110101