Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Скриншот Полноокранной DOS-программы   Найти похожие ветки 

 
kaZaNoVa ©   (2006-02-14 10:39) [0]

Сабж, как реализовать?
обычными методами не получается:(


 
SPeller ©   (2006-02-14 10:44) [1]

В свое время был озадачен этой проблемой. Пришлось программу запускать под виртуальной машиной и оттуда уже брать скриншот :)


 
Anatoly Podgoretsky ©   (2006-02-14 10:58) [2]

Загадками говоришь, вообще в большинстве случаев это копия буфера A000:0000, или B000:0000, или B800:0000
в зависимости от типа видео карты и видеорежима.


 
kaZaNoVa ©   (2006-02-14 11:28) [3]

SPeller ©   (14.02.06 10:44) [1]
аха, я сейчас так же делал .. но не всегда это приемлимо ..

Anatoly Podgoretsky ©   (14.02.06 10:58) [2]
а как оттуда брать скриншот?
обычные вещи вроде:
Var  bmp: TBitmap;
begin
bmp        := TBitmap.Create;
bmp.Height := Screen.Height;
bmp.Width  := Screen.Width;
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SRCCopy);
bmp.SaveToFile("5.bmp");
bmp.Free;


не помогают((


 
Anatoly Podgoretsky ©   (2006-02-14 11:32) [4]

kaZaNoVa ©   (14.02.06 11:28) [3]
Какой битмап, у ДОС програмы нет окна


 
Vlad Oshin ©   (2006-02-14 11:35) [5]

по адресам

> A000:0000, или B000:0000, или B800:0000


первый байт - символ, второй - фон


 
Kerk ©   (2006-02-14 12:31) [6]

В кладовке вроде была прога-пример скриншота консоли. Поищи.


 
kaZaNoVa ©   (2006-02-14 14:10) [7]

Kerk ©   (14.02.06 12:31) [6]
нашел тока:
http://kladovka.net.ru/index.cgi?pid=list&rid=30

но нет уверенности, что это то, что нужно..


 
Jeer ©   (2006-02-14 14:19) [8]

Через handle от FindWindow() по поиску ClassName = "ConsoleWindowClass";
Title = "Command Prompt";


 
kaZaNoVa ©   (2006-02-14 16:28) [9]

что-то [7] вариант не сработал .. еще есть предложения?

Jeer ©   (14.02.06 14:19) [8]
handle

как ?


 
Marser ©   (2006-02-14 16:51) [10]

Я таким баловался 5.5 лет назад. Вот фрагменты:

//Сохранение
var
scr:array[1..4000] of byte;
p:pointer;
procedure scr_copy;
begin
p:=ptr($B800,0);
move(p^,scr,4000);
end;
//Восстановление
procedure scr_copy;
begin
p:=ptr($B800,0);
move(scr,p^,4000);
end;

Работало в ТР7 для режима 80х25.


 
Альф   (2006-02-14 17:07) [11]

Скриншот полноэкранной ДОС программы прекрасно делается средствами VMWare :)


 
kaZaNoVa ©   (2006-02-14 17:12) [12]

Альф   (14.02.06 17:07) [11]
Скриншот полноэкранной ДОС программы прекрасно делается средствами VMWare :)


естественно, однако на везде установлена подобная программа - см [1]
нужна своя, програмная реализация

Marser ©   (14.02.06 16:51) [10]
а как такое чудо в файл формата BMP сохранить?)


 
Marser ©   (2006-02-14 17:31) [13]

> а как такое чудо в файл формата BMP сохранить?)

ИМХО, ничего сложного. Тот же шрифт, те же размеры. Только с цветовыми аттрибутами придётся слегка заморочиться.


 
kaZaNoVa ©   (2006-02-14 17:41) [14]

Marser ©   (14.02.06 17:31) [13]
а пример кода есть?))


 
Marser ©   (2006-02-14 17:43) [15]

> [14] kaZaNoVa ©   (14.02.06 17:41)
> Marser ©   (14.02.06 17:31) [13]
> а пример кода есть?))

Нету :-)
Можно будет на досуге поразмыслить :-)


 
BiN ©   (2006-02-14 17:49) [16]

ДОС приложение запускается в косоли. Получить доступ к ней можно разными способами.
С консоли же изображение снимается примерно так. (работает и в развернутом виде)


function CCOORD(AX,AY:SmallInt):COORD;
begin
 with Result do
 begin
   X:=AX; Y:=AY;
 end;
end;

function SmallRect(ALeft, ATop, ARight, ABottom: Smallint): TSmallRect;
begin
 Result.Left := ALeft;
 Result.Top := ATop;
 Result.Bottom := ABottom;
 Result.Right := ARight;
end;

procedure SaveConsoleOutput(Handle: THandle; Stream: TStream);
var
 BI: TConsoleScreenBufferInfo;
 C: COORD;
 M: Pointer;
 XLen, YLen: Integer;
 R: TSmallRect;
begin
 C.X:=0;
 C.Y:=0;
 Stream.Size:=0;

 Win32Check(GetConsoleScreenBufferInfo(Handle, BI));
 Stream.Write(BI, SizeOf(BI));
 XLen:=BI.srWindow.Right-BI.srWindow.Left+1;
 YLen:=BI.srWindow.Bottom-BI.srWindow.Top+1;

 M:=AllocMem(XLen*YLen*SizeOf(char_info));
 try
   R:=SmallRect(0,0, XLen, YLen);
   Win32Check( ReadConsoleOutputW(Handle, M,  CCOORD(XLen, YLen),
     CCOORD(0,0), R));
   Stream.Write(R, SizeOf(R));
   Stream.Write(M^, XLen*YLen*SizeOf(char_info));
 finally
 ReallocMem(M,0);
 end;
end;

procedure LoadConsoleOutput(Handle: THandle; Stream: TStream);
var
 BI: TConsoleScreenBufferInfo;
 C: COORD;
 M: Pointer;
 XLen, YLen: Integer;
 R: TSmallRect;
begin
 Stream.Seek(0, soBeginning);
 Stream.Read(BI, SizeOf(BI));

 XLen:=BI.srWindow.Right-BI.srWindow.Left+1;
 YLen:=BI.srWindow.Bottom-BI.srWindow.Top+1;

 M:=AllocMem(XLen*YLen*SizeOf(char_info));
 try
   R:=SmallRect(0,0, XLen, YLen);
   Win32Check(SetConsoleScreenBufferSize(Handle, BI.dwSize));
   Stream.Read(R, SizeOf(R));
   Stream.Read(M^, XLen*YLen*SizeOf(char_info));

   Win32Check(WriteConsoleOutputW(Handle, M, CCOORD(XLen, YLen),
     CCOORD(0,0), R));
 finally
   ReallocMem(M,0);
 end;
end;



пример использования:


var
 T: TMemoryStream;
begin
 AllocConsole;  
 Writeln("This Example save screen buffer to data stream and restore it");
 Writeln("RTFM");
 SaveConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), T);
 Writeln("blablabla");
 Writeln("blablabla");
 T.Seek(0, soBeginning);
 Writeln("Press Enter to restore screen buffer");
 Readln;
 LoadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), T);
end;



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
6-1133163165
SergP.
2005-11-28 10:32
2006.03.12
WinInet. Узнать размер контента, принимаемого по http/https


1-1139392424
ДенисНск
2006-02-08 12:53
2006.03.12
Очередь MSMQ


15-1140335748
Ega23
2006-02-19 10:55
2006.03.12
С Днём рождения! 19 февраля


15-1140220418
Yanis
2006-02-18 02:53
2006.03.12
Блин :(


2-1140437038
Василь Быков
2006-02-20 15:03
2006.03.12
Как добавить поле в таблицу ?