Lettura e scrittura di blocchi di caratteri e attributi
Importante
Questo documento descrive le funzionalità della piattaforma della console che non fanno più parte della roadmap dell'ecosistema. Non è consigliabile usare questo contenuto nei nuovi prodotti, ma continueremo a supportare gli utilizzi esistenti per il futuro indefinito. La soluzione moderna preferita è incentrata sulle sequenze di terminale virtuale per garantire la massima compatibilità negli scenari multipiattaforma. Per altre informazioni su questa decisione di progettazione, vedere il documento relativo alla console classica e al terminale virtuale.
La funzione ReadConsoleOutput copia un blocco rettangolare di dati dell'attributo carattere e colore da un buffer dello schermo della console in un buffer di destinazione. La funzione considera il buffer di destinazione come una matrice bidimensionale di strutture CHAR_INFO. Analogamente, la funzione WriteConsoleOutput copia un blocco rettangolare di dati dell'attributo carattere e colore da un buffer di origine a un buffer dello schermo della console. Per altre informazioni sulla lettura o la scrittura in blocchi rettangolari di celle del buffer dello schermo, vedere Metodi di input e output.
Nell'esempio seguente viene utilizzata la funzione CreateConsoleScreenBuffer per creare un nuovo buffer dello schermo. Dopo che la funzione SetConsoleActiveScreenBuffer rende attivo il buffer dello schermo, un blocco di caratteri e attributi di colore viene copiato dalle prime due righe del buffer dello schermo STDOUT in un buffer temporaneo. I dati vengono quindi copiati dal buffer temporaneo nel nuovo buffer dello schermo attivo. Al termine dell'uso del nuovo buffer dello schermo, l'applicazione chiama SetConsoleActiveScreenBuffer per ripristinare il buffer dello schermo STDOUT originale.
#include <windows.h>
#include <stdio.h>
int main(void)
{
HANDLE hStdout, hNewScreenBuffer;
SMALL_RECT srctReadRect;
SMALL_RECT srctWriteRect;
CHAR_INFO chiBuffer[160]; // [2][80];
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer = CreateConsoleScreenBuffer(
GENERIC_READ | // read/write access
GENERIC_WRITE,
FILE_SHARE_READ |
FILE_SHARE_WRITE, // shared
NULL, // default security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
NULL); // reserved; must be NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
printf("CreateConsoleScreenBuffer failed - (%d)\n", GetLastError());
return 1;
}
// Make the new screen buffer the active screen buffer.
if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
{
printf("SetConsoleActiveScreenBuffer failed - (%d)\n", GetLastError());
return 1;
}
// Set the source rectangle.
srctReadRect.Top = 0; // top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 1; // bot. right: row 1, col 79
srctReadRect.Right = 79;
// The temporary buffer size is 2 rows x 80 columns.
coordBufSize.Y = 2;
coordBufSize.X = 80;
// The top left destination cell of the temporary buffer is
// row 0, col 0.
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
// Copy the block from the screen buffer to the temp. buffer.
fSuccess = ReadConsoleOutput(
hStdout, // screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
{
printf("ReadConsoleOutput failed - (%d)\n", GetLastError());
return 1;
}
// Set the destination rectangle.
srctWriteRect.Top = 10; // top lt: row 10, col 0
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
srctWriteRect.Right = 79;
// Copy from the temporary buffer to the new screen buffer.
fSuccess = WriteConsoleOutput(
hNewScreenBuffer, // screen buffer to write to
chiBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect); // dest. screen buffer rectangle
if (! fSuccess)
{
printf("WriteConsoleOutput failed - (%d)\n", GetLastError());
return 1;
}
Sleep(5000);
// Restore the original active screen buffer.
if (! SetConsoleActiveScreenBuffer(hStdout))
{
printf("SetConsoleActiveScreenBuffer failed - (%d)\n", GetLastError());
return 1;
}
return 0;
}