删除 getch() 函数的延迟

Remove the delay on getch() function

我在 C 程序中使用 ncurses,我想使用 getch() 来捕获箭头键和转义键。

我使用 newterm、raw 模式、noecho 模式和键盘设置为 TRUE 以正确使用 getch。 我可以轻松获取箭头键代码或每个键的键码,但是当我按转义键时,我知道 getch 设置了一个约 1 秒的计时器来检查是否按下了其他键的 none。

您认为延迟可以删除或设置为零吗?

Man 或 IBM 文档说当您同时使用键盘时尝试使用 getch 捕获转义是没有用的,但我想得到它...

抱歉我的英语不好,谢谢你的回答:)

您必须选择是看到箭头键和功能键,还是在键入时立即获得转义键。即使您真的真的很想立即看到转义符和箭头键,您也做不到。这是因为箭头键发送的第一件事是转义字符,因此如果 wgetch 看到转义字符,它需要检查下一个字符,然后才能断定该字符是由转义键生成的。

curses 接口是为通过可能较慢的网络连接将来自终端的数据传输到计算机的可能性而设计的。作为功​​能键序列一部分的转义字符可能会在网络数据包的末尾发送,下一个字符是下一个数据包的一部分,因此两者之间可能存在延迟人物。但是,即使没有网络,键盘也不是超高速设备,并且多字符序列中的字符在发送时(对计算机)有明显的延迟。所以没有一些时间,wgetch 不可能识别功能键和方向键。

如果您准备 运行 有时将箭头键变成转义序列的风险,您可以减少转义延迟。默认设置为 1000 毫秒(1 秒),但您可以通过更改全局变量 ESCDELAY 的值来更改它。如果您的 ncurses 库是在启用适当的线程功能的情况下编译的,您还可以使用特定于 ncursesset_escdelay 函数。在这两种情况下,该值都是一个整数,表示要延迟的毫秒数。

有关详细信息,请参阅 man curs_variables and man curs_threads。 (在某些发行版上,您可能需要使用不同的 man 参数,例如 man curses_variablesman 3ncurses threads。)