首页 > 解决方案 > 如何从 C# 中的全屏控制台中删除滚动条?

问题描述

长话短说:大约一周前,我刚刚开始学习 C#。我的大部分编程知识来自 Java。我想尝试制作一款文字冒险游戏(是的,我知道我可以使用 Unity,但我想从头开始制作它),其中一部分设置是获得一个全屏控制台窗口,不会让人分心。

我已经在 StackOverflow 上进行了搜索,到目前为止我已经把它放在一起:

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetStdHandle(int handle);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleDisplayMode(IntPtr ConsoleOutput, uint Flags, out COORD NewScreenBufferDimensions);

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

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

除了 Main 方法中的这一位:

IntPtr hConsole = GetStdHandle(-11);
SetConsoleDisplayMode(hConsole, 1, out COORD b1);

Console.ReadLine();

所以我成功地进入全屏模式,但问题是滚动条仍然存在。

我已经尽力了解它的工作原理以及滚动条将如何被删除。我目前的理解是需要更改控制台的屏幕缓冲区以匹配屏幕的大小,以便滚动条可以消失。

从我设法整理的代码来看,似乎已经在使用缓冲区以全屏播放。看起来“SetConsoleDisplayMode”方法可以做到这一点。

所以我的问题是,如何将滚动条的删除添加到此代码中?我的想法是它与“COORD”结构有关,但老实说,我完全没有使用新语言和新概念(如结构)的元素,任何帮助将不胜感激!

标签: c#consoleconsole-applicationscrollbarfullscreen

解决方案


当缓冲区高度等于屏幕高度(以行为单位)时,滚动条将消失。您可以使用 noramlcmd.exe窗口进行测试。

当您将控制台设为全屏时,如果 Buffer 太小,Windows 会将其放大,并在 SetConsoleDisplayMode. 随着项目的进展,您可能需要该尺寸。因此,如果您使缓冲区非常小,Windows 会为您“修复”它。

为了更改缓冲区大小,您需要调用SetConsoleScreenBufferSize

BOOL WINAPI SetConsoleScreenBufferSize(
  _In_ HANDLE hConsoleOutput,
  _In_ COORD  dwSize
);

看起来像这样(未经测试):

[DllImport("kernel32.dll")]
private static extern bool SetConsoleScreenBufferSize(int handle, COORD newSize);

推荐阅读