我忘了什么吗?(Windows的双控制台缓冲区)
Am I forgetting something? (Double Console Buffer for Windows)
我正在尝试使用windows.h
为windows控制台制作/测试双缓冲区。
在对msdn进行了一些研究之后,我想到了这个:
//Free current console
if ( FreeConsole() == 0 ) return GetLastError();
//Get clean console
if ( AllocConsole() == 0 ) return GetLastError();
HANDLE buffer1 = GetStdHandle( STD_OUTPUT_HANDLE );
HANDLE buffer2 = CreateConsoleScreenBuffer( GENERIC_WRITE,
0,
NULL,
CONSOLE_TEXTMODE_BUFFER,
NULL );
COORD begin;
begin.X = 0;
begin.Y = 0;
SetConsoleCursorPosition(buffer1, begin);
DWORD writen;
WriteConsole( buffer1,
L"Milkn",
5,
&writen,
NULL );
WriteConsole( buffer2,
L"Melkn",
5,
&writen,
NULL );
system("PAUSE");
SetConsoleActiveScreenBuffer( buffer2 );
WriteConsole( buffer2,
L"Malkn",
5,
&writen,
NULL );
WriteConsole( buffer1,
L"Mulkn",
5,
&writen,
NULL );
system("PAUSE");
SetConsoleActiveScreenBuffer( buffer1 );
system("PAUSE");
CloseHandle( buffer2 );
return 0; //End of main
谢天谢地,这是预期的工作。
首先屏幕输出只是:
Milk
然后:
Melk
Malk
和结束:
Milk
Mulk
我对此有几个问题:
1)开始时的FreeConsole()
和AllocConsole()
真的有必要吗?
2)我应该使用CloseHandle()
为buffer1了吗?或者我不应该将它用于buffer2?
你认为还有什么重要的要指出来的吗?
PS:这是我的第一个问题,我希望我没有违反任何准则。
PS²:我只使用system("PAUSE")
,因为这是一个测试,你不应该担心我在实际的软件中使用它。
找到了答案,以防有人感兴趣:
我发现这根本没有什么区别。但是,如果您从cmd执行程序,将确保弹出另一个控制台。2) CloseHandle()
应该只用于控制台屏幕缓冲区。标准输出将自动处理。
相关文章:
- C++字符*缓冲区的大小
- C++:将控制台输出存储在宏中更好吗
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++控制台应用程序阻止退出
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何修复此iFile以将.txt输出到控制台
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 为什么控制台要求输入,即使代码中没有输入
- 多线程双缓冲区
- 通过行和列设置控制台屏幕尺寸和屏幕缓冲区
- 如何将字符串从缓冲区粘贴到控制台程序
- 以十六进制表示法(0xABCDEF)将字节缓冲区的字节输出到控制台输出流
- 我忘了什么吗?(Windows的双控制台缓冲区)