【问题标题】:Capturing the effects of SetConsoleTextAttribute when redirected through a Pipe?通过管道重定向时捕获 SetConsoleTextAttribute 的效果?
【发布时间】:2010-02-06 01:19:41
【问题描述】:

我已将使用CreateProcess 生成的子进程的stdout 重定向到管道。它工作正常,除了据我所知,没有关于颜色变化的信息。子进程正在使用SetConsoleTextAttribute 更改文本颜色——是否可以通过管道检测到这一点,如果可以,如何检测?

我最终会在RichEdit 控件中显示输出,如果可能的话,我想捕获颜色信息。

这是在 XP 和 Vista 上带有 Win32 API 的 C 语言。

【问题讨论】:

  • SetConsoleTextAttribute 只影响调用代码的控制台,与流或管道无关。就像您不希望管道告诉您窗口是否已最大化一样,它也不会告诉您是否已完成此操作。也就是说,我确信有一个解决方法。 :)

标签: c winapi colors pipe redirect


【解决方案1】:

您可能需要使用此处找到的 ReadConsoleOutput(和/或相关的):http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    可能有一种解决方法...它旧且不常用!

    1. 使用 Ansi.Sys 并加载它。
    2. 每当您将文本输出到控制台时,通过使用 Escape 序列,您可以设置文本周围的颜色。
    3. 然后将转义序列解析为 RichText Colors 的等效序列。

    转义序列是标准的hereHere 是如何在控制台中添加对 ANSI.SYS 的支持。 here 是 Microsoft 提供的有关如何执行此操作的官方 KB。

    举个例子:

    printf("\x1b[33;43蓝底黄\x1b[0\n");

    现在,解析\x1b[之后的位,33是黄色前景,43是蓝色背景,然后查找相关颜色并设置在RichTextBox中。..

    注意:\x1b[0 关闭该属性。

    编辑:这可能不是最佳解决方案,因为它适用于 XP 或更高版本下的旧版 NTVDM 的 16 位 DOS command.com。但是,我在这里找到了另一个指向“ansicon”的链接,它适用于纯 cmd.exe 32 位控制台,支持 ANSI。

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 我严重怀疑这是否可行。您将使用 ANSI.SYS 将转义字符串发送到标准输出以生成 SetConsoleTextAttribute() 调用。不是相反。
    • @nobugz:你是 100% 正确的......哦......当......我明白你的意思...... :(
    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多