c# - 如何从 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”结构有关,但老实说,我完全没有使用新语言和新概念(如结构)的元素,任何帮助将不胜感激!
解决方案
当缓冲区高度等于屏幕高度(以行为单位)时,滚动条将消失。您可以使用 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);
推荐阅读
- jsf - 使用 preRenderView,以正确的方式将用户重定向到其他页面
- sql - 如何使用多个 LIKE 谓词优化查询
- python - 如何修复'translate()得到一个意外的关键字参数'格式''
- python - 使用 PeriodIndex 绘制熊猫数据框
- php - PHP 中的正则表达式返回 preg_match():编译失败:PCRE 不支持 \L、\l、\N{name}、\U 或 \u
- python - 如何避免在这个特定的 python 代码片段中使用循环?
- mysql - 计数函数只返回一行,但只显示一个客户的前 5 个航班号的计数。这里有什么问题?
- javascript - 需要优化代码来检查以下 json 转换的几个条件
- sql - 想从两个不同的表中减去两个日期,出现语法错误
- .net - 在项目引用链中,输出中缺少引用的 dll