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

Вниз

Как снять скриншот ?   Найти похожие ветки 

 
Скрин   (2005-07-13 03:39) [0]

Мне дали одну функцию, как это делать. Но она глючит. Часто вылетает какая то ошибка "неверный параметр". Не знаю, что это такое. Может у кого есть безглючный вариант ?


 
Essence   (2005-07-13 04:03) [1]

procedure MakeScreenShot(const ATarget: TBitmap);
var
 DesktopDC: HDC;
begin
 DesktopDC := CreateDC("DISPLAY", nil, nil, nil);
 try
   ATarget.PixelFormat := pfDevice;
   ATarget.Width := Screen.Width;
   ATarget.Height := Screen.Height;
 
   BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
 finally
   DeleteDC(DesktopDC);
 end;
end;


В процедуру нужно передавать объект типа TBitmap:
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeScreenShot(Image1.Picture.Bitmap);
end;


 
Просто Джо ©   (2005-07-13 04:09) [2]

Вот, держив "самопал" из одного проекта.
При необходимости, накладывает даже изображение курсора.


unit ScrUtil;

interface
uses Windows, SysUtils, Graphics;

procedure MakeScreenshot (Bmp: TBitmap; CaptureCursor: Boolean = True);

implementation
uses Controls, Forms;

procedure MakeScreenshot (Bmp: TBitmap; CaptureCursor: Boolean = True);
var
 DC: HDC;
 ACursor: HICON;
 Pt: TPoint;
 CurInfo: tagCURSORINFO;
 IcoInfo: _ICONINFO;
begin
 Bmp.Width := Screen.Width;
 Bmp.Height := Screen.Height;

 DC := GetDC (GetDesktopWindow);
 try
   BitBlt (
     Bmp.Canvas.Handle,
     0,0,Bmp.Width,Bmp.Height,
     DC,
     0,0,
     SRCCOPY);

   // -- курсор
   if CaptureCursor then
   begin

     CurInfo.cbSize := SizeOf(CurInfo);
     GetCursorInfo(CurInfo);

     ACursor := CurInfo.hCursor;
     Pt := CurInfo.ptScreenPos;

     GetIconInfo (ACursor,IcoInfo);

     DrawIcon(
       Bmp.Canvas.Handle,
       Pt.X-IcoInfo.xHotspot,
       Pt.Y-IcoInfo.yHotspot,
       ACursor
     )
   end;

 finally
   ReleaseDC (GetDesktopWindow,DC);
 end;
end;

end.


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

procedure TScrnShtFrm.Button5Click(Sender: TObject);
var
 Bmp: TBitmap;
begin
 Bmp := TBitmap.Create;
 try
   // снимаем изображение экрана с курсором
   MakeScreenshot(Bmp,True);
   // и сохраняем его в файл директории программы
   Bmp.SaveToFile(ExtractFilePath(ParamStr(0))+"screen.bmp");
 finally
   Bmp.Free;
 end;
end;


 
Скрин   (2005-07-21 01:20) [3]


> Essence   (13.07.05 04:03) [1]
> procedure MakeScreenShot(const ATarget: TBitmap);
> var
>  DesktopDC: HDC;
> begin
>  DesktopDC := CreateDC("DISPLAY", nil, nil, nil);
>  try
>    ATarget.PixelFormat := pfDevice;
>    ATarget.Width := Screen.Width;
>    ATarget.Height := Screen.Height;
>  
>    BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
> DesktopDC, 0, 0, SRCCOPY);
>  finally
>    DeleteDC(DesktopDC);
>  end;
> end;
>
> В процедуру нужно передавать объект типа TBitmap:
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> MakeScreenShot(Image1.Picture.Bitmap);
> end;


Эта функция делает скриншот не всего. Пропускает некоторые элементы изображения.

Я делаю :

 const
   NumColors = 256;
 var
   Canv : TCanvas;
   LP   : PLogPalette;
   Size : Integer;
   TmpPalette : HPalette;

...

Canv       := TCanvas.Create;
try
 Canv.Handle := GetDC(HWND_DESKTOP);
 try
   Img.Canvas.CopyRect(Rect1, Canv, Rec2);
   Size := SizeOf(TLogPalette) +(Pred(NumColors) *SizeOf(TPaletteEntry));
   LP   := AllocMem(Size);
   try
     LP^.palVersion    := $300;
     LP^.palNumEntries := NumColors;
     GetSystemPaletteEntries(Canv.Handle, 0, NumColors, LP^.palPalEntry);
     TmpPalette := CreatePalette(LP^);
     Img.Picture.Bitmap.Palette := TmpPalette;
     DeleteObject(TmpPalette);
   finally
     FreeMem(LP, Size);
   end
 finally
   ReleaseDC(HWND_DESKTOP, Canv.Handle);
 end;
finally
 Canv.Free;
end;


Эта функция и глючит. Почему ? Как поправить ?


 
Essence   (2005-07-21 23:12) [4]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   ButtonExit: TButton;
   Button1: TButton;
   procedure ButtonExitClick(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
 public
   procedure MakeScreenShot(const AusSchnitt: TBitmap);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
function EnumMiniProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
begin
 if Wd = Form1.Handle then
   If  IsWindowVisible(WD) then
     If  not IsIconic(WD) then
       If  isWindow(WD) then
         ShowWindow(WD, SW_MINIMIZE);

 EnumMiniProc := TRUE;
end;

procedure TForm1.ButtonExitClick(Sender: TObject);
begin
 Close;
end;

procedure TForm1.MakeScreenShot(const AusSchnitt: TBitmap);
var
DesktopDC: HDC;
begin
DesktopDC := GetDC(HWND_DESKTOP);
try
  AusSchnitt.PixelFormat := pfDevice;
  StretchBlt(AusSchnitt.Canvas.Handle, AusSchnitt.Width, AusSchnitt.Height,
             -AusSchnitt.Width, -AusSchnitt.Height, DesktopDC, 0, 0,Screen.Width,
             Screen.Height, SRCCOPY);

  BitBlt(DesktopDC, 0, 0, AusSchnitt.Width, AusSchnitt.Height,
         AusSchnitt.Canvas.Handle, 0, 0, SRCCOPY);
finally
  DeleteDC(DesktopDC);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Bmp: TBitmap;
begin
 EnumWindows(@EnumMiniProc, 0);

 Bmp := TBitmap.Create;
 try
   Bmp.Width := Screen.Width;
   Bmp.Height := Screen.Height;
   MakeScreenShot(Bmp);
   Bmp.SaveToFile("TestDSK.bmp");
 finally
   Bmp.Free;
 end;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
14-1121628347
Knight
2005-07-17 23:25
2005.08.07
Ремонт XP...


14-1121268154
Kerk
2005-07-13 19:22
2005.08.07
DIV element


14-1121751761
Leya
2005-07-19 09:42
2005.08.07
Изменить расширение


8-1112567795
кактусбел
2005-04-04 02:36
2005.08.07
Как получить текущий уровень громкости


1-1121511757
Kreyl
2005-07-16 15:02
2005.08.07
Access Violation при использовании DATA MODULE