在控制台中隐藏滚动条而不会闪烁

时间:2013-10-24 13:59:46

标签: c# scrollbar console-application

我在一秒钟内多次在控制台窗口中写字。

我想出了如何删除滚动条:

Console.BufferWidth = Console.WindowWidth = 35;
Console.BufferHeight = Console.WindowHeight;

到目前为止一切都很好。但是当我想写一行的最后一列时,它会添加一个新行!这是合乎逻辑的,但如何避免这种情况?

我试图调整控制台的大小:

Console.BufferWidth++;
Console.BufferHeight++;

// Write to the last column of a line

Console.BufferWidth--;
Console.BufferHeight--;

但是这会闪烁,因为这些行会在一秒钟内多次执行!

任何想法或我是否必须使用滚动条?

3 个答案:

答案 0 :(得分:7)

尝试使用Console.SetBufferSize(width,height);我认为这会有所帮助。

答案 1 :(得分:2)

我使用原生方法进行绘图管理。

#region Native methods

[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern SafeFileHandle CreateFile(
    string fileName,
    [MarshalAs(UnmanagedType.U4)] uint fileAccess,
    [MarshalAs(UnmanagedType.U4)] uint fileShare,
    IntPtr securityAttributes,
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    [MarshalAs(UnmanagedType.U4)] int flags,
    IntPtr template);

[StructLayout(LayoutKind.Sequential)]
public struct Coord
{
    public short X;
    public short Y;

    public Coord(short X, short Y)
    {
        this.X = X;
        this.Y = Y;
    }
};

[DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteConsoleOutputCharacter(
    SafeFileHandle hConsoleOutput,
    string lpCharacter,
    int nLength,
    Coord dwWriteCoord,
    ref int lpumberOfCharsWritten);

#endregion


public static void Draw(int x, int y, char renderingChar)
{
    // The handle to the output buffer of the console
    SafeFileHandle consoleHandle = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);

    // Draw with this native method because this method does NOT move the cursor.
    int n = 0;
    WriteConsoleOutputCharacter(consoleHandle, renderingChar.ToString(), 1, new Coord((short)x, (short)y), ref n);
}

WriteConsoleOutputCharacter不会移动光标。因此,即使在最后一行的最后一列中绘制,光标也不会跳到下一行(窗口大小之外)并打破视图。

答案 2 :(得分:1)

问题不在于光​​标直接转到下一行。它真正做的是,它向右移动一个字符,因为缓冲区结束它到达下一行。

所以我尝试做类似Console.WriteLine(“C \ r \ n”)的操作;将光标设置回来但仍然闪烁

我想过使用一些偷偷摸摸的伎俩并使用阿拉伯语右对标记但没有奏效。

所以我能想到的最好的方法是将角色移动到右下角 Console.MoveBufferArea 方法,因为这不会将光标设置到下一个右侧位置并避开新行