I'm using VB6 SP5. The C example below is from the October 2000 version of the MS Platform SDK.

This is the declare that I'm using:

Private Declare Function ReadConsoleOutput Lib "kernel32" Alias "ReadConsoleOutputA" (ByVal hConsoleOutput As Long, lpBuffer As CHAR_INFO, dwBufferSize As COORD, dwBufferCoord As COORD, lpReadRegion As Long) As Long

It seems that you have to pass the lpReadRegion param as a long instead of a SMALL_RECT. You might also have to pass the COORDs as longs. Here is the function that I'm using to convert the COORDs to longs:

Private Function pGetCoord(ByVal x As Long, ByVal y As Long) As Long

'
Dim crd As Long

CopyMemory crd, x, 2
CopyMemory ByVal (VarPtr(crd) + 2), y, 2

pGetCoord = crd

End Function

There might be a problem with the CHAR_INFO structure. In C, it includes a Union. This is what VB offers:

Private Type CHAR_INFO
iChar As Integer
iAttributes As Integer
End Type


Here is part of the VB code that I was using. All I end up getting from Debug.Print is zeros.


Dim i As Long
Dim ret As Long
Dim crdc As COORD 'Long
Dim crds As COORD 'Long
Dim srr As SMALL_RECT
Dim srw As SMALL_RECT

'Set the source rectangle
srr.top = 0
srr.Left = 0
srr.Bottom = 1
srr.Right = 79

'The temporary buffer size is 2 rows x 80 columns
'crds = pGetCoord(80, 2)
crds.x = 80
crds.y = 2

'The top left destination cell of the temporary buffer is row 0, col 0
'crdc = pGetCoord(0,0)
crdc.x = 0
crdc.y = 0

'Copy the block from the screen buffer to the temp buffer
ReDim ci(160) As CHAR_INFO

ret = ReadConsoleOutput(ml_StdOutput, ci(0), crds, crdc, VarPtr(srr))

For i = 0 To 160
Debug.Print ci(i).iChar, ci(i).iAttributes
Next i

---

#include <windows.h>

VOID 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,
0, // not shared
NULL, // no security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
NULL); // reserved; must be NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
MyErrorExit("CreateConsoleScreenBuffer");
}

// Make the new screen buffer the active screen buffer.

if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
MyErrorExit("SetConsoleActiveScreenBuffer");

// 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)
MyErrorExit("ReadConsoleOutput");

// 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)
MyErrorExit("WriteConsoleOutput");
Sleep(10000);

// Restore the original active screen buffer.

if (! SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit("SetConsoleActiveScreenBuffer");

}