如何从C#中的全屏控制台中删除滚动条?

时间:2018-05-03 20:09:25

标签: c# console console-application scrollbar fullscreen

长话短说:我刚刚在一周前拿起了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”有关。结构,但说实话,我完全不在我的元素中,使用新语言和新概念(如结构),任何帮助都会受到赞赏!

2 个答案:

答案 0 :(得分:0)

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

当你的控制台全屏时,如果它太小,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);

答案 1 :(得分:0)

该类是为您定义的,它会自动全屏显示控制台并删除滚动条,纯黑控制台屏幕仅适用于您,您可以执行任何操作 ##

public class SetLayout
{
    // Control the console whole setting
    public void Set()
    {
        Console.SetBufferSize(Console.LargestWindowWidth, Console.LargestWindowHeight);               // Remove the console both scroll bars

        IntPtr hConsole = FullScreen.GetStdHandle(-11);                                                // Get console handle
        FullScreen.COORD xy = new FullScreen.COORD(100, 100);
        FullScreen.SetConsoleDisplayMode(hConsole, 1, out xy);                                       // Set the console to fullscreen

        AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);        //  Set to not show the "Press any key to continue"

        Console.CursorVisible = false;                                                           // Remove the cursor from the console
    }

    // Handler Method to remove the "Press any key to continue........."
    void CurrentDomain_ProcessExit(object sender, EventArgs e)
    {
        FullScreen.ShowWindow(FullScreen.ThisConsole,0);
    }
}

// Class is setting the console window full screen
internal static class FullScreen
{
    [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")]
    public static extern IntPtr GetStdHandle(int handle);

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

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

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}

您只需要编写main方法:

SetLayout s = new SetLayout(); s.Set();