Главная страница
    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.014 c
4-1134982464
Chaser
2005-12-19 11:54
2006.03.12
При закрытии программы - минимизация в трей


1-1139500353
Piter
2006-02-09 18:52
2006.03.12
Указание кодировки текста в буфере обмена


2-1140641543
вася
2006-02-22 23:52
2006.03.12
массив и сеть


2-1141044901
Piero
2006-02-27 15:55
2006.03.12
TMemo


2-1140438415
Mamed
2006-02-20 15:26
2006.03.12
SQL 2005





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский