我忘了什么吗?(Windows的双控制台缓冲区)

Am I forgetting something? (Double Console Buffer for Windows)

本文关键字:控制台 缓冲区 Windows 什么 我忘了      更新时间:2023-10-16

我正在尝试使用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()应该只用于控制台屏幕缓冲区。标准输出将自动处理。