Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Codigo para capturar una pantalla del PC en archivo BITMAP (https://www.clubdelphi.com/foros/showthread.php?t=96878)

navbuoy 05-10-2024 15:38:22

Codigo para capturar una pantalla del PC en archivo BITMAP
 
Código:

#include <windows.h>

Código:

///// Declaramos la funcion ScreenShot()
void ScreenShot(char*BmpName);



 void ScreenShot(char*BmpName)
{
        HWND DesktopHwnd = GetDesktopWindow();
        RECT DesktopParams;
        HDC DevC = GetDC(DesktopHwnd);
        GetWindowRect(DesktopHwnd,&DesktopParams);
        DWORD Width = DesktopParams.right - DesktopParams.left;
        DWORD Height = DesktopParams.bottom - DesktopParams.top;

        DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1*(Width*Height*4));
        char *BmpFileData = (char*)GlobalAlloc(0x0040,FileSize);

        PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
        PBITMAPINFOHEADER  BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];

        BFileHeader->bfType = 0x4D42; // BM
        BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
        BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

        BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
        BInfoHeader->biPlanes = 1;
        BInfoHeader->biBitCount = 24;
        BInfoHeader->biCompression = BI_RGB;
        BInfoHeader->biHeight = Height;
        BInfoHeader->biWidth = Width;

        RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
        RGBTRIPLE color;

        HDC CaptureDC = CreateCompatibleDC(DevC);
        HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC,Width,Height);
        SelectObject(CaptureDC,CaptureBitmap);
        BitBlt(CaptureDC,0,0,Width,Height,DevC,0,0,SRCCOPY|CAPTUREBLT);
        GetDIBits(CaptureDC,CaptureBitmap,0,Height,Image,(LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);

        DWORD Junk;
        HANDLE FH = CreateFileA(BmpName,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0);
        WriteFile(FH,BmpFileData,FileSize,&Junk,0);
        CloseHandle(FH);
                GlobalFree(BmpFileData);
}

USO:
Código:

AnsiString archivoBMP;

ScreenShot(archivoBMP.c_str());


navbuoy 05-10-2024 15:44:07

he tratado de convertirlo pero no se si estara bien, por si os da la cosa de probarlo en Delphi

Código:

uses
  Windows, SysUtils;

procedure ScreenShot(BmpName: string);
var
  DesktopHwnd: HWND;
  DesktopParams: TRect;
  DevC: HDC;
  Width, Height: DWORD;
  FileSize: DWORD;
  BmpFileData: Pointer;
  BFileHeader: PBITMAPFILEHEADER;
  BInfoHeader: PBITMAPINFOHEADER;
  Image: PRGBTriple;
  CaptureDC: HDC;
  CaptureBitmap: HBITMAP;
  Junk: DWORD;
  FH: THandle;
begin
  DesktopHwnd := GetDesktopWindow();
  DevC := GetDC(DesktopHwnd);
  GetWindowRect(DesktopHwnd, DesktopParams);
  Width := DesktopParams.Right - DesktopParams.Left;
  Height := DesktopParams.Bottom - DesktopParams.Top;

  FileSize := SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + (SizeOf(RGBTRIPLE) * Width * Height);
  BmpFileData := GlobalAlloc(GPTR, FileSize);

  BFileHeader := PBITMAPFILEHEADER(BmpFileData);
  BInfoHeader := PBITMAPINFOHEADER(Pointer(NativeUInt(BmpFileData) + SizeOf(BITMAPFILEHEADER)));

  BFileHeader.bfType := $4D42; // BM
  BFileHeader.bfSize := FileSize;
  BFileHeader.bfOffBits := SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER);

  BInfoHeader.biSize := SizeOf(BITMAPINFOHEADER);
  BInfoHeader.biPlanes := 1;
  BInfoHeader.biBitCount := 24;
  BInfoHeader.biCompression := BI_RGB;
  BInfoHeader.biHeight := Height;
  BInfoHeader.biWidth := Width;

  Image := PRGBTriple(Pointer(NativeUInt(BmpFileData) + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER)));

  CaptureDC := CreateCompatibleDC(DevC);
  CaptureBitmap := CreateCompatibleBitmap(DevC, Width, Height);
  SelectObject(CaptureDC, CaptureBitmap);
  BitBlt(CaptureDC, 0, 0, Width, Height, DevC, 0, 0, SRCCOPY or CAPTUREBLT);
  GetDIBits(CaptureDC, CaptureBitmap, 0, Height, Image^, PBITMAPINFO(BInfoHeader), DIB_RGB_COLORS);

  FH := CreateFile(PChar(BmpName), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(FH, BmpFileData^, FileSize, Junk, nil);
  CloseHandle(FH);

  GlobalFree(BmpFileData);
  DeleteObject(CaptureBitmap);
  DeleteDC(CaptureDC);
  ReleaseDC(DesktopHwnd, DevC);
end;



La franja horaria es GMT +2. Ahora son las 11:24:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi