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