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

Вниз

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

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

Наверх





Память: 0.46 MB
Время: 0.048 c
3-1120226748
Ландграф Павел
2005-07-01 18:05
2005.08.07
обработка события BeforeAction в DBNavigator


14-1121002318
Piter
2005-07-10 17:31
2005.08.07
Декомпиляция флеша


14-1121748060
lookin
2005-07-19 08:41
2005.08.07
Помогите перевести фразу...


4-1118239226
Andreykass
2005-06-08 18:00
2005.08.07
LPT порт


1-1121420117
granni
2005-07-15 13:35
2005.08.07
отладка dll





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