如何在C#中移除全屏控制台窗口的滚动条?
嘿,刚接触C#一周就想着从零做文字冒险游戏,这劲头太赞了!从Java转过来肯定有不少熟悉的编程逻辑,但控制台全屏这种偏系统层面的操作,确实得借助Windows的API来实现,你找的kernel32.dll的思路完全没问题,我给你补全完整的可运行代码,再拆解每个部分的作用,方便你理解和调整:
完整的全屏控制台实现代码
using System; using System.Runtime.InteropServices; class FullScreenConsole { // 导入kernel32.dll中的相关API [DllImport("kernel32.dll")] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] private static extern bool SetConsoleDisplayMode(IntPtr hConsoleOutput, uint dwFlags, out COORD lpNewScreenBufferSize); [DllImport("kernel32.dll")] private static extern bool SetConsoleCursorInfo(IntPtr hConsoleOutput, ref CONSOLE_CURSOR_INFO lpConsoleCursorInfo); [DllImport("kernel32.dll")] private static extern bool SetConsoleWindowInfo(IntPtr hConsoleOutput, bool bAbsolute, ref SMALL_RECT lpConsoleWindow); [DllImport("kernel32.dll")] private static extern bool SetConsoleScreenBufferSize(IntPtr hConsoleOutput, COORD dwSize); // 定义需要用到的结构体 [StructLayout(LayoutKind.Sequential)] private struct COORD { public short X; public short Y; public COORD(short x, short y) { X = x; Y = y; } } [StructLayout(LayoutKind.Sequential)] private struct SMALL_RECT { public short Left; public short Top; public short Right; public short Bottom; } [StructLayout(LayoutKind.Sequential)] private struct CONSOLE_CURSOR_INFO { public uint dwSize; public bool bVisible; } // 常量定义 private const int STD_OUTPUT_HANDLE = -11; private const uint CONSOLE_FULLSCREEN_MODE = 1; public static void EnableFullScreen() { IntPtr consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 设置全屏模式 COORD dummyCoord; SetConsoleDisplayMode(consoleHandle, CONSOLE_FULLSCREEN_MODE, out dummyCoord); // 获取屏幕分辨率,设置控制台缓冲区和窗口大小匹配屏幕 int screenWidth = Console.LargestWindowWidth; int screenHeight = Console.LargestWindowHeight; COORD bufferSize = new COORD((short)screenWidth, (short)screenHeight); SetConsoleScreenBufferSize(consoleHandle, bufferSize); SMALL_RECT windowRect = new SMALL_RECT() { Left = 0, Top = 0, Right = (short)(screenWidth - 1), Bottom = (short)(screenHeight - 1) }; SetConsoleWindowInfo(consoleHandle, true, ref windowRect); // 隐藏光标,避免干扰文字冒险游戏的沉浸感 CONSOLE_CURSOR_INFO cursorInfo = new CONSOLE_CURSOR_INFO(); cursorInfo.dwSize = 1; cursorInfo.bVisible = false; SetConsoleCursorInfo(consoleHandle, ref cursorInfo); } public static void DisableFullScreen() { IntPtr consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); COORD dummyCoord; // 恢复窗口模式 SetConsoleDisplayMode(consoleHandle, 0, out dummyCoord); // 恢复光标可见 CONSOLE_CURSOR_INFO cursorInfo = new CONSOLE_CURSOR_INFO(); cursorInfo.dwSize = 1; cursorInfo.bVisible = true; SetConsoleCursorInfo(consoleHandle, ref cursorInfo); } static void Main(string[] args) { EnableFullScreen(); Console.WriteLine("欢迎来到你的文字冒险游戏!按任意键退出全屏..."); Console.ReadKey(); DisableFullScreen(); } }
关键部分解释
- DllImport特性:这是C#调用Windows原生API的方式,和Java的JNI有点类似,但写法更简洁,这里我们导入了
kernel32.dll里几个控制控制台的核心函数。 - 全屏模式切换:
SetConsoleDisplayMode传入CONSOLE_FULLSCREEN_MODE就能让控制台切换到全屏,退出时传入0恢复窗口模式。 - 缓冲区和窗口大小匹配:如果只开全屏不调整缓冲区,可能会出现滚动条,所以我们用
Console.LargestWindowWidth/Height获取屏幕最大可用尺寸,把缓冲区和窗口都设成这个大小,保证无滚动条的全屏体验。 - 隐藏光标:文字冒险游戏讲究沉浸感,光标晃来晃去很出戏,所以用
SetConsoleCursorInfo把光标可见性设为false,退出时再恢复。
使用提示
- 这段代码只能在Windows系统上运行,因为依赖Windows的
kernel32.dll,如果你以后想跨平台,可能得换其他方案,但文字冒险游戏先在Windows上搞完全没问题。 - 你可以把
EnableFullScreen()放在游戏启动的最开始,退出游戏前调用DisableFullScreen()恢复系统默认状态。 - 如果需要处理按键退出全屏(比如按Esc),可以在游戏主循环里监听
Console.ReadKey()的按键值,判断后调用恢复方法。
内容的提问来源于stack exchange,提问作者8BiT
相关产品推荐
相关产品推荐

