【发布时间】:2017-01-19 11:30:52
【问题描述】:
我目前正在尝试用 C# 编写一个带有两个屏幕缓冲区的控制台应用程序,它们应该来回交换(很像现代 GPU 上的 VSync)。由于System.Console 类没有提供切换缓冲区的方法,我不得不从 kernel32.dll 中 P/Invoke 几个方法。
这是我当前的代码,非常简化:
static void Main(string[] args)
{
IntPtr oldBuffer = GetStdHandle(-11); //Gets the handle for the default console buffer
IntPtr newBuffer = CreateConsoleScreenBuffer(0, 0x00000001, IntPtr.Zero, 1, 0); //Creates a new console buffer
/* Write data to newBuffer */
SetConsoleActiveScreenBuffer(newBuffer);
}
发生了以下事情:
- 屏幕仍然是空的,尽管它应该显示
newBuffer - 当写入
oldBuffer而不是newBuffer时,数据会立即出现。因此,我写入缓冲区的方式应该是正确的。 - 在调用
SetConsoleActiveScreenBuffer(newBuffer)时,错误代码现在为6,表示句柄无效。这很奇怪,因为句柄不是 -1,文档将其描述为无效。
我应该注意,我很少直接使用 Win32 API,并且对常见的 Win32 相关问题了解甚少。我将不胜感激。
【问题讨论】:
-
请勿不致电
GetLastError,除非明确要求这样做。有关更多信息,请参阅此documentation。阅读完毕后,更新您的问题。 -
好吧,但这并没有真正改变整个问题太多。重点是设置缓冲区不起作用,我不明白为什么。
-
您至少可以从 “发生的事情” 列表中删除多余的观察结果。明确指出观察到的行为与记录的行为匹配没有任何价值。
-
我删除了关于获取当前控制台缓冲区的一项,但我保留了第二项,因为我相信那里的调用会失败
-
它失败了,因为你传入了一个无效的句柄。您没有检查
CreateConsoleScreenBuffer的返回值,并且为 dwDesiredAccess 传递 0 似乎不正确。
标签: c# winapi console-application