{{notification.text}}

MirGames

05.10.06 15:36
0
Как его сделать, наверняка есть стандартная функция. Вчера искал по названию(пытался найти что нить похожее:)) ), не нашел . Помогите пожалста
#1
аксакал
05.10.06 20:51
0
Код
program ScreenShot;

uses
Windows;

procedure ApiScrCapture(const FileName: String);
type
  TScr = array [0..1] of Byte;
  PScr = ^TScr;
var
  hBmp       : hBitmap;
  DeskDC     : hDC;
  DC         : hDC;
  BFH        : BITMAPFILEHEADER;
  BIH        : tagBITMAPINFO;
  ScrX, ScrY : Integer;
  F          : File;
  ScrSize    : Cardinal;
  Bits       : PScr;
begin
  SCRX     := GetSystemMetrics(SM_CXSCREEN);
  SCRY     := GetSystemMetrics(SM_CYSCREEN);
  ScrSize  := ScrX * ScrY * 3;

  GetMem(Bits, ScrSize);

  DeskDC   := GetDC(0);
  hBmp     := CreateCompatibleBitmap(DeskDC, ScrX, ScrY);
  DC       := CreateCompatibleDC(DeskDC);

  SelectObject(DC, hbmp);
  BitBlt(DC, 0, 0, SCRX, SCRY, DeskDC, 0, 0, SrcCopy);

  with BFH do
  begin
    bfType      := $4D42;
    bfSize      := SCRX * SCRY * 3 + SizeOf(BFH) + SizeOf(BIH);
    bfReserved1 := 0;
    bfReserved2 := 0;
    bfOffBits   := SizeOf(BFH) + SizeOf(BIH);
  end;

  with BIH.bmiHeader do
  begin
    biSize         := sizeof(BIH);
    biWidth        := SCRX;
    biHeight       := SCRY;
    biPlanes       := 1;
    biBitCount     := 24;
    biCompression  := BI_RGB;
    biSizeImage    := ScrSize;
    biClrImportant := 0;
  end;

  GetDiBits(DC, hbmp, 0, SCRY, Bits, BIH, DIB_RGB_COLORS);
  DeleteObject(hbmp);
//------- Кидаем в bmp файл -------//
  AssignFile(F, FileName);
  Rewrite(F, 1);
  Blockwrite(F, BFH, SizeOf(BFH));
  Blockwrite(F, BIH, SizeOf(BIH));
  Blockwrite(F, bits^, ScrSize);
  CloseFile(F);
  FreeMem(Bits);
end;

begin
  ApiScrCapture('ScreenShot.bmp');
end.
#2
Пытка Онлайн!
06.10.06 00:04
0
Помоему XProger всё усложняет. Там проще можно.
#3
статус
06.10.06 00:14
0
Franz
А помойму все просто я бы тоже так сделал.
#4
06.10.06 00:28
0
А как проще???
#5
MirGames Dev
06.10.06 00:47
0
Цитата
Помоему XProger всё усложняет. Там проще можно.
По идее из всего того кода только строчек пять ответственны за снятие скриншота(и то половина из них - это объявление переменных), а всё остальное - тупо запись в bmp.
#6
статус
06.10.06 00:51
0
ну я и говорю что все просто. ;)
#7
аксакал
06.10.06 00:54
0
Copy/Paste что может быть проще? ;)
Не отрицаю конечно, что можно проще... Жду от Franz'а решения, ибо самому интересно :)
#8
Limited Edition
06.10.06 10:39
0
XProger, а как твоим способом реализовать аналог Alt+PrintScreen?
Отредактировано: 06.10.06 14:34
#9
аксакал
06.10.06 11:51
0
RzCoDer
По Handle активного окна найти область им занимаемую, и копировать только её.
#10
06.10.06 13:59
0
XPrroger спасибо. Franz, а вас я попрошу остаться, пиши еще рещение, ждут минимум двое человек

всем спасибо
Отредактировано: 06.10.06 14:34
#11
Проект "Канализация"
10.10.06 01:04
0
А не забыли ReleaseDC?
И потом почему GetMem на 24bpp?
#12
аксакал
10.10.06 01:11
0
Vasiliy
Забыли, но это не страшно.
А почему не 24?
#13
Koshmarik
10.10.06 03:10
0
var
bm: TBitMap;
begin
bm := TBitMap.Create;
bm.Width := Screen.Width;
bm.Height := Screen.Height;
BitBlt(bm.Canvas.Handle, 0, 0,bm.Width, bm.Height,GetDC(0), 0, 0, SRCCOPY);
// bm - искомый скриншот
bm.destroy;
end;

сохранение в файл - bm.savetofile(string name);
Отредактировано: 10.10.06 04:00
#14
MirGames Dev
10.10.06 03:26
0
Koshmarik
Гм. и вправду по идее VCL не запрещалось использовать.

P.S. VCL - зло.
#15
аксакал
10.10.06 04:28
0
MeF Dei Corvi
Ограничение на использование VCL накладывается разделом в котором данный топик находится ;)
#16
Koshmarik
10.10.06 05:33
0
А, ну да. Не заметил. Но, в принципе, не всегда полезно велосипед изобретать. Иногда полезно знать и где его взять.
#17
аксакал
10.10.06 15:47
0
Koshmarik
Верно, со всеми вытекающими отсюда последствиями... ;)
#18
статус
10.10.06 17:12
0
Кста еще один способ, прграммно нажать кнопочку Prt Screen и скопировать изображение из буфера обмена...

P.S. способ для изващенцев
Отредактировано: 10.10.06 17:36
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}