Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Скриншот Полноокранной 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.012 c
1-1138704330
Counter Terranist
2006-01-31 13:45
2006.03.12
PageControl.TabPosition в ХР


2-1140895416
49 Cent
2006-02-25 22:23
2006.03.12
Как программно определить текущий месяц?


2-1140507460
Piero
2006-02-21 10:37
2006.03.12
Разложить byte на биты


3-1137241298
vol
2006-01-14 15:21
2006.03.12
Как установить нужную кодировку MySql в Дулфи


2-1140431364
sanich
2006-02-20 13:29
2006.03.12
В FieldDefs поле Numeric (16.0)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский