在 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 的正确方法 的相关文章

  • Install ncurses (ncurses-devel) and try again.

    主要就是终端图形配置时最容易出现的问题 xff0c 比如最常见的make menuconfig xff0c 解决方法 xff1a sudo apt get install ncurses devel 屏幕弹出 xff1a 找不到这个软件 x
  • 在 ncurses 中实现文本滚动的推荐方法是什么?

    我正在尝试实现一个 ncurses 应用程序 其文本滚动效果如下 推荐的方法是什么 这是我所知道的 您可以使用scroll将文本缓冲区向上或向下移动 1 行 但是 如果向下滚动 您最终会在顶部出现一个空行 如果向上滚动 则会在底部出现一个空
  • macOS 上的 Clang 无法从 ncurses 链接 lmenu

    我是使用 ncurses 库的新手 所以我一直在尝试重新创建此页面上的一些示例 http www tldp org HOWTO NCURSES Programming HOWTO index html 我已经获得了有关创建菜单的部分 特别是
  • ncurses 到外壳并返回弄乱密钥

    我有这个 ncurses 应用程序正在执行标准配方 暂时退出 ncurses 运行外部 编辑器 shell 无论什么 然后在完成后返回 ncurses 这几乎可以工作 除了 ncurses 的前几个按键 之后得到的显然是假的 ncurses
  • openpty 之后的 ncurses newterm

    我正在尝试弄清楚如何执行以下操作 创建一个新的伪终端 打开在 从属 伪终端内运行的 ncurses 屏幕 fork A 将 I O 从程序运行的终端 bash 转发到新的 从属 终端或 B 退出 让 ncurses 程序在新 pty 中运行
  • ncurses:奇怪的行格式

    我有这个代码可以与 ncurses 一起使用 include
  • ncursesw 函数未声明

    我需要使用支持 unicode 的 ncurses 因此我将以下行添加到我的 c 文件中 include
  • CLion 在单独的系统终端中运行程序

    我有一个ncurses我想使用 CLion 进行交互式调试的程序 问题是 当我在 CLion 中运行程序进行调试时 运行程序的内置控制台不显示ncurses正确编程 我想让程序在我的系统终端中运行 这样我就可以在使用 CLions 调试器调
  • Qt宏关键字导致名称冲突

    我正在为我的 Qt 项目构建 NCurses 界面 我想使用 CDK 但我认为signals该结构的成员与 Qt 发生冲突signals关键词 usr include linux cdk h 411 error expected unqua
  • Ncurses:如何刷新菜单而不丢失当前位置?

    如何在不丢失当前位置的情况下重新加载菜单中的数据 例如 当用户 选择 某个项目时 执行的操作会更改数据 更新项目 删除项目或向菜单添加新项目 我想重新加载菜单 但仍将光标保留在刚刚选择的项目上 最好的方法是什么 作为参考 这个问题似乎非常接
  • 在 Mac OS X 上编译 ncurses 应用程序时出错

    我试图在 Mac OS X 10 6 8 上编译基于 ncurses 的应用程序 但出现此错误 Undefined symbols for architecture x86 64 initscr referenced from main i
  • 如何读取不完整的表单字段 ncurses C++

    我有一个使用 ncurses C 读取表单字段的代码 但是当表单字段未完全键入时我无法显示值 include
  • 哪些 ncurses 框架可用于 BASH? [复制]

    这个问题在这里已经有答案了 是否还有更多适用于 bash 的文本用户界面 TUI 框架 除此之外 http code google com p bashsimplecurses http code google com p bashsimp
  • 在虚拟终端中使用 ncurses

    我对 Linux 虚拟终端以及 Curses 都很陌生 所以如果这个描述不太清楚 请原谅我 我正在尝试在 Fedora 12 上使用 Curses 将状态信息输出到虚拟终端 您知道可以通过按 ctrl alt Fx 访问的终端之一 当我在虚
  • Python 中的 N-curses:如何捕获并打印非 ASCII 字符?

    我想用 ncurses python 制作一个小程序 并且能够使用 输入法语和日语 我知道我应该设置区域设置并使用 unicode 标准 但是如何处理 screen getch 的结果呢 我想在 ncurses 窗口中显示键入的字符 而不管
  • 使用 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函
  • ncurses 终端大小

    如何找到 ncurses 应用程序的终端宽度和高度 void getmaxyx WINDOW win int y int x http linux die net man 3 getmaxyx我相信 另外 这可能会有所帮助 在C中获取终端宽
  • 如何在 ncurses 中获得亮白色?

    如何初始化浅灰色背景和亮白色前景的颜色对 init pair number COLOR WHITE COLOR WHITE 创建一个具有浅灰色前景和背景的颜色对 但我需要前景是真正的白色 我尝试将 COLOR WHITE 与 A BLINK
  • 如何在 Mac 上使用 Emscripten emcc 和 make 时包含 ncurses

    我正在尝试构建一个项目 即 Angband 的源代码 http rephial org downloads 3 3 angband v3 3 2 tar gz http rephial org downloads 3 3 angband v

随机推荐

  • 如何更改 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