
Hacer Print Screen
#1
Escrito 09 enero 2009 - 03:52
Quisiera saber si alguen sabe como hacer un print Srim (copiar la pantalla del escritorio).
Por codigo.
Saludos
#2
Escrito 09 enero 2009 - 04:12
Para capturar la pantalla completa:
keybd_event(vk_snapshot,0, 0, 0);
Para capturar la ventana activa:
keybd_event(vk_snapshot,1, 0, 0);
Saludos.
#3
Guest_Jose Fco_*
Escrito 09 enero 2009 - 04:13
Un Saludo.
#4
Escrito 09 enero 2009 - 04:22
Para guardarla como bmp:
procedure GuardarPantalla(Filename: String); var DC: HDC; Bmp: Tbitmap; begin Bmp:= TBitmap.Create; try with Bmp do begin Width:= GetSystemMetrics(SM_CXSCREEN); Height:= GetSystemMetrics(SM_CYSCREEN); Dc:= GetDC(GetDesktopWindow); try BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY); finally ReleaseDC(GetDesktopWindow,Dc); end; SaveToFile(Filename); end; finally Bmp.free; end; end;
Para guardarla como jpg:
uses Jpeg; procedure GuardarPantalla(Filename: String); var DC: HDC; Bmp: Tbitmap; Jpg: TJPEGImage; begin Bmp:= TBitmap.Create; Jpg:= TJPEGImage.Create; try with Bmp do begin Width:= GetSystemMetrics(SM_CXSCREEN); Height:= GetSystemMetrics(SM_CYSCREEN); Dc:= GetDC(GetDesktopWindow); try BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY); finally ReleaseDC(GetDesktopWindow,Dc); end; end; with Jpg do begin Assign(Bmp); CompressionQuality:= 60; Compress; SaveToFile(Filename); end; finally Bmp.free; Jpg.free; end; end;
Para copiarla al portapapeles:
uses Clipbrd; procedure GuardarPantalla; var DC: HDC; Bmp: Tbitmap; begin Bmp:= TBitmap.Create; try with Bmp do begin Width:= GetSystemMetrics(SM_CXSCREEN); Height:= GetSystemMetrics(SM_CYSCREEN); Dc:= GetDC(GetDesktopWindow); try BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY); finally ReleaseDC(GetDesktopWindow,Dc); end; Clipboard.Assign(Bmp); end; finally Bmp.free; end; end;
#5
Escrito 09 enero 2009 - 04:23


Saludos.
#6
Escrito 09 enero 2009 - 04:27
Muy bien.
Ahora: Como y donde pongo esto?.
Ejemplito amigo, ejemplito.

Saludos
EDITO: Ya vi el de Seoane, No dije nada,......



#7
Escrito 09 enero 2009 - 04:30
Hola
Muy bien.
Ahora: Como y donde pongo esto?.
Ejemplito amigo, ejemplito.
Saludos
EDITO: Ya vi el de Seoane, No dije nada,......![]()
![]()
jajajaja, a parte de los ejemplos de seoane, los míos los podías colocar en un Button o en cualquier evento.

#8
Escrito 11 enero 2009 - 12:37
#9
Escrito 25 junio 2009 - 08:44
Gracias
#10
Escrito 25 junio 2009 - 08:58
Como se haria en ves de usar BitBlt, usando GetDIBits? lo mismo tomando el Print Screen.
Gracias
Hola c0lo, bienvenido a la Comunidad DelphiAccess
Puedes ver este ejemplo para que te des una idea de como se usa con GetDIBits (aunque esta en C++).
Salud OS
#11
Escrito 26 junio 2009 - 04:34
Saludos.
#12
Escrito 26 junio 2009 - 03:04
escafandra, gracias por la invitacion amigo

Bueno escafandra, entonces no puedo usar GetDIBits, en ves de BitBlt, ya que como me mencionas una api como el BitBlt, coje de un DC la imagen , en cambio el GetDIBits, de una Bitmap(de una manera mas simple de decirlo).
Lo que tendria que hacer es simular, el "vk_snapshot", es decir, simular el llamado a dicha funcion o usar la api GetClipboardData, la cual me crea la imagen y solo tendria que usar esos dos apis en un principio, para poder reemplazar al BitBlt.
BitBlt -> NewBitBlt(GetClipboardData,GetDIBits)
NewBitBlt:
#include<windows.h> #include<stdio.h> void TakeScreenie(char* filename) { keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); HBITMAP h; OpenClipboard(NULL); h = (HBITMAP)GetClipboardData(CF_BITMAP); HDC hdc = NULL; FILE* fp = NULL; LPVOID pBuf = NULL; BITMAPINFO bmpInfo; BITMAPFILEHEADER bmpFileHeader; do { hdc = GetDC(NULL); ZeroMemory(&bmpInfo,sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); if(bmpInfo.bmiHeader.biSizeImage <= 0) bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8; { MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR); break; } bmpInfo.bmiHeader.biCompression=BI_RGB; GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS); { MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR); break; } bmpFileHeader.bfReserved1 = 0; bmpFileHeader.bfReserved2 =0; bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage; bmpFileHeader.bfType = 'MB'; bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); } while(false); if(hdc)ReleaseDC(NULL,hdc); EmptyClipboard(); CloseClipboard(); } int main() { while (1)TakeScreenie("test.jpg"); return 0; }
E busco referente a ello, y bueno no se si podrian ayudarme a pasarlo a Delphi que es el lenguaje que mas conosco y en el cual necesito usar dicha funcion.
Gracias
#13
Escrito 26 junio 2009 - 05:15
#14
Escrito 27 junio 2009 - 01:24

Mas opto yo, por un enterno donde el cual no puedo usar dicha Api y hay que adaptarse a el, sin ella.
#15
Escrito 28 junio 2009 - 03:11
El mas importante se refiere a la firma del tipo de archivo BM para bmp que es lo que el código guarda en el disco. El segundo darle la extensión bmp y no jpg.
Este código está probado en Builder C++ 5 en Windows XP.
#include<windows.h> #include<stdio.h> void TakeScreenie(char* filename) { keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); HBITMAP h; OpenClipboard(NULL); h = (HBITMAP)GetClipboardData(CF_BITMAP); HDC hdc = NULL; FILE* fp = NULL; LPVOID pBuf = NULL; BITMAPINFO bmpInfo; BITMAPFILEHEADER bmpFileHeader; hdc = GetDC(NULL); ZeroMemory(&bmpInfo,sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); if(bmpInfo.bmiHeader.biSizeImage <= 0) bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8; if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) == NULL){ MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR); return; } bmpInfo.bmiHeader.biCompression=BI_RGB; GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS); if((fp = fopen(filename,"wb"))==NULL){ MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR); return; } bmpFileHeader.bfReserved1 = 0; bmpFileHeader.bfReserved2 =0; bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage; bmpFileHeader.bfType = 'BM'; //0x4D42 bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp); fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp); if(hdc)ReleaseDC(NULL,hdc); if(pBuf) free(pBuf); if(fp)fclose(fp); EmptyClipboard(); CloseClipboard(); } int main() { TakeScreenie("test.bmp"); return 0; }
Saludos.
#16
Escrito 29 junio 2009 - 07:09
Una rápida aproximación a delphi, sin mucho control de errores, seria mas o menos así:
program Project1; uses Windows, SysUtils; procedure TakeScreenie(filename: String); var hdc: Integer; h: HBITMAP; pBuf: pointer; fp: HFILE; bmpInfo: BITMAPINFO; bmpFileHeader: BITMAPFILEHEADER; ofs : OFSTRUCT; wd: DWORD; begin keybd_event(VK_SNAPSHOT, $45, KEYEVENTF_EXTENDEDKEY, 0); sleep(100); keybd_event(VK_SNAPSHOT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); OpenClipboard(0); h := GetClipboardData(CF_BITMAP); hdc := GetDC(0); ZeroMemory(@bmpInfo, sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize := sizeof(BITMAPINFOHEADER); GetDIBits(hdc, h, 0, 0, nil, bmpInfo, DIB_RGB_COLORS); if bmpInfo.bmiHeader.biSizeImage <= 0 then bmpInfo.bmiHeader.biSizeImage := bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)Shr 3; pBuf := AllocMem(bmpInfo.bmiHeader.biSizeImage); bmpInfo.bmiHeader.biCompression:=BI_RGB; GetDIBits(hdc, h, 0, bmpInfo.bmiHeader.biHeight, pBuf, bmpInfo, DIB_RGB_COLORS); fp:=OpenFile(Pchar(filename), ofs, OF_CREATE or OF_WRITE); bmpFileHeader.bfReserved1 := 0; bmpFileHeader.bfReserved2 :=0; bmpFileHeader.bfSize := sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage; bmpFileHeader.bfType := $4D42; bmpFileHeader.bfOffBits := sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); WriteFile(fp, bmpFileHeader, sizeof(BITMAPFILEHEADER),wd, nil); WriteFile(fp, bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER),wd,nil); WriteFile(fp, pBuf^, bmpInfo.bmiHeader.biSizeImage,wd,nil); if hdc<>0 then ReleaseDC(0, hdc); if pBuf<> nil then FreeMem(pBuf); if fp<>0 then CloseHandle(fp); EmptyClipboard(); CloseClipboard(); end; begin TakeScreenie('test.bmp'); end.
Saludos.
#17
Escrito 29 junio 2009 - 02:51


#18
Escrito 29 junio 2009 - 03:03
Muchas Gracias
jajajajaja,

#19
Escrito 29 junio 2009 - 03:32
Muchas Gracias
Bueno, bueno, no es para tanto.

#20
Escrito 29 junio 2009 - 03:43
Muchas Gracias
Bueno, bueno, no es para tanto.
Ah joder, estos iconos nuevos si que son un peligro



Salud OS