3

我每秒多次在控制台窗口中写入。

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

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

但这会闪烁,因为这些行每秒会执行多次。

有任何想法吗?

4

4 回答 4

12

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

于 2014-02-26T16:47:19.447 回答
5

我用本机方法绘图来管理它。

#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不移动光标。因此,即使在最后一行的最后一列中绘制时,光标也不会跳到下一行(超出窗口大小)并破坏视图。

于 2015-02-06T18:38:25.760 回答
1

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

所以我尝试做类似 Console.WriteLine("C\r"); 将光标设置回来但它仍然闪烁

比我想过使用一些鬼鬼祟祟的技巧并使用阿拉伯语从右到左标记但没有奏效。

所以我能想到的最好的方法是使用Console.MoveBufferArea方法将字符移动到右下角,因为这不会将光标设置到下一个正确的位置并避免换行

于 2014-07-03T14:12:06.917 回答
0

如果您想完全隐藏控制台应用程序的垂直滚动条,我有一个工作代码。

开始了 ..

这适用于任何分辨率。

经我测试。

class Program
    {
        private const int MF_BYCOMMAND = 0x00000000;
        public const int SC_CLOSE = 0xF060;
        public const int SC_MINIMIZE = 0xF020;
        public const int SC_MAXIMIZE = 0xF030;
        public const int SC_SIZE = 0xF000;

        [DllImport("user32.dll")]
        public static extern int DeleteMenu(IntPtr hMenu, int nPosition,intwFlags);

        [DllImport("user32.dll")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("kernel32.dll", ExactSpelling = true)]
        private static extern IntPtr GetConsoleWindow();

        static void Main(string[] args)
        {
            var largestWindowX = Console.WindowWidth;
            var largestWindowY = Console.WindowHeight;
            
            Console.BufferWidth = Console.WindowWidth = largestWindowX;
            Console.BufferHeight = Console.WindowHeight = largestWindowY;

            IntPtr handle = GetConsoleWindow();
            IntPtr sysMenu = GetSystemMenu(handle, false);

            if (handle != IntPtr.Zero)
            {
                DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND);
                DeleteMenu(sysMenu, SC_MINIMIZE, MF_BYCOMMAND);
                DeleteMenu(sysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
                DeleteMenu(sysMenu, SC_SIZE, MF_BYCOMMAND);
            }
        }
    }
于 2022-02-18T13:51:22.157 回答