gpt4 book ai didi

c# - SetConsoleActiveScreenBuffer 不显示屏幕缓冲区

转载 作者:行者123 更新时间:2023-12-02 10:47:07 25 4
gpt4 key购买 nike

我目前正在尝试用 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 相关问题知之甚少。我将不胜感激任何形式的帮助。

最佳答案

正如 IInspectable 在评论中指出的那样,您将 dwDesiredAccess 设置为零。这为您提供了一个没有访问权限的句柄。在某些边缘情况下,这样的句柄很有用,但这不是其中之一。

唯一有点奇怪的是你得到的是“无效句柄”而不是“访问被拒绝”。我猜您运行的是 Windows 7,因此句柄是用户模式对象(“伪句柄”)而不是内核句柄。

无论如何,您需要将dwDesiredAccess设置为GENERIC_READ | GENERIC_WRITE 如图所示in the sample code .

<小时/>

此外,正如 Hans 在评论中指出的那样,pinvoke.net 上的声明不正确,将最后一个参数指定为四字节整数而不是指针大小的整数。我认为正确的声明是

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateConsoleScreenBuffer(
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwFlags,
IntPtr lpScreenBufferData
);

关于c# - SetConsoleActiveScreenBuffer 不显示屏幕缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com