2008-10-13 134 views

回答

23

Console.SetCursorPosition,Console.BackgroundColor,Console.ForegroundColor和Console.ResetColor。

注意這些已添加到版本2.0中的.NET Framework。在此之前,您將需要PInvoke。

6

按照Mono Library List至少有兩個庫,可能對您有用:

  • Curses#使用在Windows PDCurses和ncurses的Linux操作系統。它幾乎是二進制級別的跨平臺。

  • MonoCurses是curses的MIT-X11許可綁定,它包括用於創建基於控制檯的應用程序的minimalistic gui.cs GUI工具包。

4

This posting展示瞭如何使用Console類的方法來創建控制檯上的進度條 - 這可能是一個很好的例子,指....

2

最有效的功能是WriteConsoleOutput。它是天然的Win32 API,但可在.NET應用程序使用對可使用/調用:

[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 
} 

COORD和SMALL_RECT:

[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; 
    } 
}