使用ncurses获取显示中的文本

问题描述 投票:0回答:3

有什么方法可以取回输出到 ncurses 变量中的字符吗?

假设我愿意:

printw("test");

然后我希望能够:

somefunc(strbuffer);
printf("%s",strbuffer); // test

我需要一个函数来将屏幕上的所有字符返回到变量中,scr_dump 已关闭,但输出格式不可读..

c ncurses curses
3个回答
11
投票

如果您使用curses函数(例如addch、mvaddch、addstr)将内容放在屏幕上,您可以使用

inchstr
)和相关函数从屏幕读取字符(通过与返回值与进行AND运算来提取它们)
A_CHARTEXT
)。

但是,如果您使用 printf 或任何其他非 Curses 方法在屏幕上放置文本(包括对另一个使用 Curses 的程序的系统调用),您将无法读取屏幕内容。

Curses 在内部维护当前屏幕内容,inchstr 函数使用屏幕的内部表示来查找当前内容。


3
投票

有两组函数用于从屏幕上检索数据。 如果您的

printw
仅使用(如问题中所示)表示为 8 位编码(ASCII、POSIX、ISO-8859-1)的文本,则
inch
inchstr
可以工作:

  • inch
    检索单个单元格及其属性
  • inchstr
    检索多个单元格及其属性

或更简单地使用

instr
及其变体。 这些函数返回数据,无需额外屏蔽字符的属性。

但是,如果数据使用多字节编码(例如 UTF-8),则必须使用不同的接口来检索字符。 这些相当于

inch
inchstr

复杂字符是一种结构,X/Open Curses 将其视为不透明。 您必须使用

getcchar
从每个单元格的数据中提取数据(例如宽字符字符串)。

A(一点)更简单一点,你可以从窗口中读取宽字符字符串信息:

总而言之,虽然您的应用程序可以将数据作为

char
(或单个
chtype
值)数组放置,但在 UTF-8 环境中,它必须将其检索为 复杂字符宽字符。 如果您碰巧使用 Linux,通常可以将
wchar_t
视为 Unicode 值。 将数据作为
wchar_t
值的数组给出,您可以使用其他(非curses)函数来获取多字节(UTF-8)字符串。

由于问题说的是 ncurses 而不是简单地 curses,因此有必要指出使用 ncurses 的应用程序与 X/Open Curses 的不同之处在于它们在屏幕上放置数据的方式(这可能会影响您对检索数据的期望) 。 在 ncurses 中,

addch
(以及类似的面向
char
的函数)将处理多字节字符串(例如 UTF-8)中的字节,并将结果存储为宽字符。 迄今为止,其他 X/Open Curses 实现都没有这样做。 其他人将这些字节视为独立的,并可能将它们表示为无效的宽字符。

顺便说一句,自从2010年提出这个问题以来,ncurses的

scr_dump
格式已经扩展,使其“可读”。


0
投票

正如其他答案中提到的,您可以使用

inch(int)
mvinch(int, int)
方法,并将
&
A_CHARTEXT

这是之前答案中缺少的一些示例代码

int row = 0;
char buffer[101];

/* Read first 100 characters from row 0 */
for (int i = 0; i < 100; ++i) {
    buffer[i] = mvinch(row, i) & A_CHARTEXT;
}
buffer[100] = '\0';
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.