区块链技术博客
www.b2bchain.cn

SetConsoleActiveScreenBuffer不显示屏幕缓冲区 – c#程序员分享

本文介绍了SetConsoleActiveScreenBuffer不显示屏幕缓冲区 – c#程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我目前正在尝试使用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所示。

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

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

如何在不使用c#中的stdout的情况下将DIRECTLY直接写入控制台?我正在升级一些旧程序,将它的stdout重定向到文件中(因为输出很重要),并且我需要某种方式直接写到控制台,并且文本不会出现在stdout中。是否可以(不使用WinAPI)?编辑:我知道写到stderr的可能性,是否可以在控制台上为stderr设置光标位置? 参考方案 您可以写入Con…

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

来自字节跳动的一道几何题题解:1/4

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » SetConsoleActiveScreenBuffer不显示屏幕缓冲区 – c#程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们