代码之家  ›  专栏  ›  技术社区  ›  Jimmy

.NET中的高级控制台IO

  •  17
  • Jimmy  · 技术社区  · 17 年前

    在屏幕上任意位置使用自定义前景色/背景色向文本控制台写入数据的最佳方法是什么?

    4 回复  |  直到 12 年前
        1
  •  24
  •   C. Dragon 76    17 年前

    console.setcursorposition、console.backgroundcolor、console.foregroundcolor和console.resetcolor。

    注意:这些是在2.0版中添加到.NET框架中的。在那之前,你需要松果。

        2
  •  6
  •   Magnus Lindhe    17 年前

    根据 Mono Library List 至少有两个库对您有用:

    • Curses# 在Windows上使用pdcurse,在Linux上使用ncurse。它几乎是二进制级的跨平台。

    • MonoCurses 是一个MIT-X11许可的Curses绑定,它包括用于创建基于控制台的应用程序的最简单的gui.cs gui工具包。

        3
  •  4
  •   Werg38    17 年前

    This posting 演示如何使用控制台类方法在控制台上创建进度条-这可能是一个很好的例子,可以参考….

        4
  •  2
  •   Igor Kostomin    12 年前

    最有效的功能是 WriteConsoleOutput . 它是本机Win32 API,但可以在.NET应用程序中使用p/invoke:

    [DllImport("kernel32.dll", SetLastError = true, EntryPoint = "WriteConsoleOutputW")]
    public static extern bool WriteConsoleOutput(IntPtr hConsoleOutput, CHAR_INFO[,] lpBuffer, COORD dwBufferSize,
                                                     COORD dwBufferCoord, ref SMALL_RECT lpWriteRegion);
    

    其中char_info是一个结构:

    /// <summary>
    /// CharSet.Unicode is required for proper marshaling.
    /// </summary>
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
    public struct CHAR_INFO
    {
        [FieldOffset(0)]
        public char UnicodeChar;
        [FieldOffset(0)]
        public char AsciiChar;
        [FieldOffset(2)] //2 bytes seems to work properly
        public Attr Attributes;
    
        public override string ToString() {
            return string.Format("CHAR_INFO : '{0}' ({1})", AsciiChar, Attributes);
        }
    }
    

    AtTR结构:

    /// <summary>
    /// CHAR_ATTRIBUTES native structure.
    /// </summary>
    [Flags]
    public enum Attr : ushort {
        NO_ATTRIBUTES = 0x0000,
        /// <summary>
        /// Text color contains blue.
        /// </summary>
        FOREGROUND_BLUE = 0x0001,
        /// <summary>
        /// Text color contains green.
        /// </summary>
        FOREGROUND_GREEN = 0x0002,
        /// <summary>
        /// Text color contains red.
        /// </summary>
        FOREGROUND_RED = 0x0004,
        /// <summary>
        /// Text color is intensified.
        /// </summary>
        FOREGROUND_INTENSITY = 0x0008,
        /// <summary>
        /// Background color contains blue.
        /// </summary>
        BACKGROUND_BLUE = 0x0010,
        /// <summary>
        /// Background color contains green.
        /// </summary>
        BACKGROUND_GREEN = 0x0020,
        /// <summary>
        /// Background color contains red.
        /// </summary>
        BACKGROUND_RED = 0x0040,
        /// <summary>
        /// Background color is intensified.
        /// </summary>
        BACKGROUND_INTENSITY = 0x0080,
        /// <summary>
        /// Leading byte.
        /// </summary>
        COMMON_LVB_LEADING_BYTE = 0x0100,
        /// <summary>
        /// Trailing byte.
        /// </summary>
        COMMON_LVB_TRAILING_BYTE = 0x0200,
        /// <summary>
        /// Top horizontal
        /// </summary>
        COMMON_LVB_GRID_HORIZONTAL = 0x0400,
        /// <summary>
        /// Left vertical.
        /// </summary>
        COMMON_LVB_GRID_LVERTICAL = 0x0800,
        /// <summary>
        /// Right vertical.
        /// </summary>
        COMMON_LVB_GRID_RVERTICAL = 0x1000,
        /// <summary>
        /// Reverse foreground and background attribute.
        /// </summary>
        COMMON_LVB_REVERSE_VIDEO = 0x4000,
        /// <summary>
        /// Underscore.
        /// </summary>
        COMMON_LVB_UNDERSCORE = 0x8000
    }
    

    坐标和小矩形:

    [StructLayout(LayoutKind.Sequential)]
    public struct COORD
    {
        public short X;
        public short Y;
    
        public COORD(short X, short Y)
        {
            this.X = X;
            this.Y = Y;
        }
    };
    
    [StructLayout(LayoutKind.Sequential)]
    public struct SMALL_RECT
    {
        public short Left;
        public short Top;
        public short Right;
        public short Bottom;
    
        public SMALL_RECT(short left, short top, short right, short bottom) {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }
    }
    
    推荐文章