Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.82.120.188] |
|
Сообщ.
#1
,
|
|
|
// В качестве параметров передаются: // AHandle - хэндл окна, скриншот которого мы хочем получить // CompressPercent - процент сжатия картинки // AImage - картинка, в которую будет помещено изображение // в случае успешного скриншота функция вернет True 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; |
Сообщ.
#2
,
|
|
|
Ещё способ:
keybd_event(VK_SNAPSHOT,1,KEYEVENTF_KEYUP,0); OpenClipBoard(Form1.handle); try SetClipBoardData(CF_DIB,Form1.handle); vv:=GetClipBoardData(CF_BITMAP); Image1.Picture.LoadFromClipboardFormat(CF_BITMAP,vv,0); finally CloseClipBoard; EmptyClipBoard; end; |
Сообщ.
#3
,
|
|
|
Еще один способ получения скриншота окна, на чистом WinApi:
function CreateWindwowBitmap(Wnd: HWND): HBITMAP; var R: TRect; W, H: Integer; DC, memDC: HDC; bm, oldBM: HBITMAP; begin GetWindowRect(Wnd, R); W := R.Right - R.Left; H := R.Bottom - R.Top; DC := GetWindowDC(Wnd); memDC := CreateCompatibleDC(DC); bm := CreateCompatibleBitmap(DC, W, H); oldBM := SelectObject(memDC, bm); BitBlt(memDC, 0,0, w, h, DC, 0,0, SRCCOPY); SelectObject(memDC, oldBM); DeleteDC(memDC); DeleteObject(oldBM); ReleaseDC(Wnd, DC); Result := bm; end; Автор: Krid |
Сообщ.
#4
,
|
|
|
Универсальный способ - скриншот с прозрачностью:
procedure CaptureScreen(AFileName: string); const CAPTUREBLT = $40000000; var hdcScreen: HDC; hdcCompatible: HDC; bmp: TBitmap; hbmScreen: HBITMAP; begin // Create a normal DC and a memory DC for the entire screen. The // normal DC provides a "snapshot" of the screen contents. The // memory DC keeps a copy of this "snapshot" in the associated // bitmap. hdcScreen := CreateDC('DISPLAY', nil, nil, nil); hdcCompatible := CreateCompatibleDC(hdcScreen); // Create a compatible bitmap for hdcScreen. hbmScreen := CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES)); // Select the bitmaps into the compatible DC. SelectObject(hdcCompatible, hbmScreen); bmp := TBitmap.Create; bmp.Handle := hbmScreen; BitBlt(hdcCompatible, 0, 0, bmp.Width, bmp.Height, hdcScreen, 0, 0, SRCCOPY or CAPTUREBLT); bmp.SaveToFile(AFileName); bmp.Free; DeleteDC(hdcScreen); DeleteDC(hdcCompatible); end; // from http://www.swissdelphicenter.ch |