СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как взять скриншот экрана и сохранить его картинкой на винт?

Ответ

Есть, как минимум, два способа:

1. имитировать нажатие клавиши Print Screen:

procedure TForm1.Button1Click(Sender: TObject);
var Clpbrd: TClipboard;
Bmp1: TBitmap;
begin
Clpbrd:=TClipboard.Create;
Bmp1:=TBitmap.Create;
try
Clpbrd.Open;
keybd_event(VK_SNAPSHOT,1,0,0); // Print Screen
Bmp1.Assign(Clpbrd);
Bmp1.SaveToFile('MyScreenPicture.bmp');
finally
Clpbrd.Close;
Bmp1.Free;
Clpbrd.Free;
end;
end;


2. захватить рисунок из девайс-контекста экрана (информация есть в хелпе Win32 SDK):

procedure TForm1.Button1Click(Sender: TObject);
var hWndScreen: HWND;
DesktopDC, MemoryDC: Integer;
hBmpPrev: Integer;
Bitmap1: TBitmap;
begin
hWndScreen:=GetDesktopWindow;
DesktopDC:=GetWindowDC(hWndScreen);
MemoryDC:=CreateCompatibleDC(DesktopDC);
Bitmap1:=TBitmap.Create;
Bitmap1.Handle:=CreateCompatibleBitmap(DesktopDC,Screen.Width,Screen.Height);
hBmpPrev:=SelectObject(MemoryDC,Bitmap1.Handle);
BitBlt(MemoryDC,0,0,Screen.Width,Screen.Height,DesktopDC,0,0,SRCCOPY);
Bitmap1.Handle:=SelectObject(MemoryDC,hBmpPrev);
Bitmap1.SaveToFile('MyScreenPicture.bmp');
ReleaseDC(hWndScreen,DesktopDC);
DeleteDC(MemoryDC);
Bitmap1.Free;
end;


Недостаток 1-го способа в том, что будет использоваться буфер обмена и соответственно данные, которые там находились, прийдется или где-то сохранять с последующим восстановлением, или же просто удалять.

Из конференции Expert_FAQ



Copyright © 2000-2004 Сообщество Чайников
Контактная информация