Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как сделать скриншот окна


Автор: arm11111 10.8.2009, 18:16
как сделать скриншот окна зная его Handle даже если оно за приделами рабочего стола ?

Автор: THandle 10.8.2009, 18:35
http://forum.vingrad.ru/forum/topic-245243/anchor-entry1769994/0.html

Автор: arm11111 10.8.2009, 23:24
Цитата(THandle @ 10.8.2009,  18:35)
http://forum.vingrad.ru/forum/topic-245243/anchor-entry1769994/0.html

че то ничего не получается , а по названию окна ? 

Автор: Данкинг 10.8.2009, 23:38
Из ДРКБ:

Код

function GetScreenShot(const AHandle: THandle; const CompressPercent: Byte;

var AImage: TJPEGImage): Boolean;

var

fBitmap: TBitmap;

DC: HDC;

Rect: TRect;

begin

Result := False;

if AImage = nil then Exit;

DC := GetDC(AHandle);

if DC <> 0 then

try

   fBitmap := TBitmap.Create;

   try

     if not GetClientRect(AHandle, Rect) then Exit;

     fBitmap.Width := Rect.Right - Rect.Left;

     fBitmap.Height := Rect.Bottom - Rect.Top;

     fBitmap.PixelFormat := pf32bit;

     Result := BitBlt(fBitmap.Canvas.Handle, 0, 0, fBitmap.Width,

       fBitmap.Height, DC, 0, 0, SRCCOPY);

     if not Result then Exit;

     AImage.Assign(fBitmap);

     AImage.CompressionQuality := CompressPercent;

   finally

     fBitmap.Free;

   end;

finally

   ReleaseDC(AHandle, DC);

end;

end;

 

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

procedure TForm1.Button1Click(Sender: TObject);

var

Image: TJPEGImage;

begin

// Скриншот рабочего стола

Image := TJPEGImage.Create;

try

   if GetScreenShot(GetDesktopWindow, 150, Image) then

     Image1.Picture.Assign(Image);

finally

   Image.Free;

end;

// Скриншот нашей формы

Image := TJPEGImage.Create;

try

   if GetScreenShot(Handle, 150, Image) then

     Image2.Picture.Assign(Image);

finally

   Image.Free;

end;

end;


Автор: arm11111 11.8.2009, 21:14
Цитата(Данкинг @ 10.8.2009,  23:38)
Из ДРКБ:

Код

function GetScreenShot(const AHandle: THandle; const CompressPercent: Byte;

var AImage: TJPEGImage): Boolean;

var

fBitmap: TBitmap;

DC: HDC;

Rect: TRect;

begin

Result := False;

if AImage = nil then Exit;

DC := GetDC(AHandle);

if DC <> 0 then

try

   fBitmap := TBitmap.Create;

   try

     if not GetClientRect(AHandle, Rect) then Exit;

     fBitmap.Width := Rect.Right - Rect.Left;

     fBitmap.Height := Rect.Bottom - Rect.Top;

     fBitmap.PixelFormat := pf32bit;

     Result := BitBlt(fBitmap.Canvas.Handle, 0, 0, fBitmap.Width,

       fBitmap.Height, DC, 0, 0, SRCCOPY);

     if not Result then Exit;

     AImage.Assign(fBitmap);

     AImage.CompressionQuality := CompressPercent;

   finally

     fBitmap.Free;

   end;

finally

   ReleaseDC(AHandle, DC);

end;

end;

 

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

procedure TForm1.Button1Click(Sender: TObject);

var

Image: TJPEGImage;

begin

// Скриншот рабочего стола

Image := TJPEGImage.Create;

try

   if GetScreenShot(GetDesktopWindow, 150, Image) then

     Image1.Picture.Assign(Image);

finally

   Image.Free;

end;

// Скриншот нашей формы

Image := TJPEGImage.Create;

try

   if GetScreenShot(Handle, 150, Image) then

     Image2.Picture.Assign(Image);

finally

   Image.Free;

end;

end;

то что надо , спасибо огромное

Автор: arm11111 12.8.2009, 14:52
наверное задам глупый вопрос ... но это же форум для новичков . А где здесь (в коде вверху) Handle окна?

я думал будет нечто подобное 

H : HWND; // 
begin
H := FindWindow ('TForml', 'Form1’);       // вот например 

Автор: Keeper89 12.8.2009, 15:12
arm11111, функция http://msdn.microsoft.com/ru-ru/library/ms633504%28en-us,VS.85%29.aspx дает хендл рабочего стола, а во втором случае используется хендл формы (просто Handle).

Автор: arm11111 12.8.2009, 16:15
а как мне получить заполучить окно к примеру программы Paint для того чтобы сделать с него скрин ( запутался я совсем ) 

Автор: Keeper89 12.8.2009, 17:38
Цитата(arm11111 @  12.8.2009,  17:15 Найти цитируемый пост)
а как мне получить заполучить окно к примеру программы Paint для того чтобы сделать с него скрин ( запутался я совсем )  

Ты же сам пример написал выше...

Добавлено через 2 минуты и 30 секунд
Пока судьба дала посидеть под Вистой smile это будет так (поиск первого окна по классу):
Код

var
  paintHandle: THandle;
begin
  ...
  paintHandle := FindWindow ('MSPaintApp', Nil);
  ...
end.

Автор: arm11111 12.8.2009, 19:24
уважаемый Keeper89 а скриншот сделать вы забыли ? у меня именно с этим проблема 

я просто прячу чужое окно за пределы рабочего стола 


var
  h: HWND;
begin
  h := findwindow(nil, 'XXX');// xxx это нужное приложение 
  if h <> 0 then
    SetWindowPos(h, HWND_BOTTOM, 1, 1, 20, 20, swp_nosize);

теперь скрин нужно сделать , плизззз

Автор: Keeper89 12.8.2009, 20:20
Цитата(arm11111 @  12.8.2009,  17:15 Найти цитируемый пост)
а как мне получить заполучить окно к примеру программы Paint

Цитата(arm11111 @  12.8.2009,  20:24 Найти цитируемый пост)
а скриншот сделать вы забыли ? у меня именно с этим проблема

 smile  Я не телепат. С каждый постом у тебя новые подробности.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TJPEGImage;
  paintHandle: THandle;
begin

  Image := TJPEGImage.Create;
  paintHandle := FindWindow ('MSPaintApp', Nil);
  if paintHandle = 0 then Exit;
  try
    SetWindowPos(paintHandle, HWND_BOTTOM, 0, 0, 0, 0,
                 SWP_NOSIZE or SWP_SHOWWINDOW);
    SendMessage(paintHandle, WM_PAINT, 0, 0);
    if GetScreenShot(paintHandle, 150, Image) then
      Image.SaveToFile('C:\1.jpg');
    SetWindowPos(paintHandle, HWND_BOTTOM, 0, 0, 0, 0,
                 SWP_NOSIZE or SWP_HIDEWINDOW);
    SetFocus;
    ShowMessage('Скриншот сделан!');
  finally
    Image.Free;
  end;
end;

Автор: arm11111 12.8.2009, 20:39
Цитата(Keeper89 @ 12.8.2009,  20:20)
Цитата(arm11111 @  12.8.2009,  17:15 Найти цитируемый пост)
а как мне получить заполучить окно к примеру программы Paint

Цитата(arm11111 @  12.8.2009,  20:24 Найти цитируемый пост)
а скриншот сделать вы забыли ? у меня именно с этим проблема

 smile  Я не телепат. С каждый постом у тебя новые подробности.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TJPEGImage;
  paintHandle: THandle;
begin

  Image := TJPEGImage.Create;
  paintHandle := FindWindow ('MSPaintApp', Nil);
  if paintHandle = 0 then Exit;
  try
    SetWindowPos(paintHandle, HWND_BOTTOM, 0, 0, 0, 0,
                 SWP_NOSIZE or SWP_SHOWWINDOW);
    SendMessage(paintHandle, WM_PAINT, 0, 0);
    if GetScreenShot(paintHandle, 150, Image) then
      Image.SaveToFile('C:\1.jpg');
    SetWindowPos(paintHandle, HWND_BOTTOM, 0, 0, 0, 0,
                 SWP_NOSIZE or SWP_HIDEWINDOW);
    SetFocus;
    ShowMessage('Скриншот сделан!');
  finally
    Image.Free;
  end;
end;

наиогромнейшее спасибо !!!!!!!!!!!!!!  все стало на свои места )))) Извини если надоел ))) 

Автор: Keeper89 12.8.2009, 21:53
Цитата(arm11111 @  12.8.2009,  21:39 Найти цитируемый пост)
наиогромнейшее спасибо !!!!!!!!!!!!!!  все стало на свои места )))) Извини если надоел )))  

Пожалуйста, закрывай тему. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)