На экран выводит то что надо в обоих вариантах. Определяет символ неправильно. Почему?
Во-первых, модуль video не делает чуда и то, что выведено каким-то другим способом, само в VideoBuf не попадёт. Поэтому выводить нужно через video. Если же требуется прочитать что напечатал другой код или уже есть много кода со всякими Writeln, который нет возможности переписать, то придётся использовать чистый WinApi, никуда не деться:
- Код: Выделить всё
uses
windows;
var
Stdout, ScreenBuffer: HANDLE;
Buf: array[0..24] of array[0..79] of TCharInfo;
BufPos, BufSize: TCoord;
ReadRect: TSmallRect;
Security: TSecurityAttributes;
Info: TConsoleScreenBufferInfo;
begin
Writeln(Char(49));
FillChar(Security, SizeOf(Security), 0);
Stdout := GetStdHandle(STD_OUTPUT_HANDLE);
ScreenBuffer := CreateConsoleScreenBuffer(
GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
Security, CONSOLE_TEXTMODE_BUFFER, nil);
GetConsoleScreenBufferInfo(Stdout, @Info);
ReadRect.Top := Info.srWindow.Bottom - Length(Buf);
ReadRect.Left := 0;
ReadRect.Bottom := Info.srWindow.Bottom;
ReadRect.Right := Length(Buf[0]);
BufPos.X := 0;
BufPos.Y := 0;
BufSize.X := Length(Buf[0]);
BufSize.Y := Length(Buf);
if (Stdout = INVALID_HANDLE_VALUE) or
(ScreenBuffer = INVALID_HANDLE_VALUE) or
(not SetConsoleActiveScreenBuffer(ScreenBuffer)) or
(not ReadConsoleOutput(Stdout, @Buf[0][0], BufSize, BufPos, ReadRect)) then
Halt(5);
Writeln('Char code: ', Ord(Buf[High(Buf)][0].AsciiChar));
end.
Во-вторых, по той ссылке, которую я дал, прямым текстом написано:
Remark: The video unit should not be used together with the crt unit. Doing so will result in very strange behaviour, possibly program crashes.