Jump to content


Photo

Hacer Print Screen


  • Please log in to reply
24 replies to this topic

#1 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 09 January 2009 - 03:52 PM

Hola
Quisiera saber si alguen sabe como hacer un print Srim (copiar la pantalla del escritorio).
Por codigo.
Saludos
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 09 January 2009 - 04:12 PM

Para capturar la pantalla completa:


delphi
  1. keybd_event(vk_snapshot,0, 0, 0);


Para capturar la ventana activa:


delphi
  1. keybd_event(vk_snapshot,1, 0, 0);


Saludos.
  • 0

#3 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Posted 09 January 2009 - 04:13 PM

Gracias Fernando, eso esta interesante.

Un Saludo.

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 09 January 2009 - 04:22 PM

Para guardarla como bmp:


delphi
  1. procedure GuardarPantalla(Filename: String);
  2. var
  3.  DC: HDC;
  4.  Bmp: Tbitmap;
  5. begin
  6.  Bmp:= TBitmap.Create;
  7.  try
  8.    with Bmp do
  9.    begin
  10.      Width:= GetSystemMetrics(SM_CXSCREEN);
  11.      Height:= GetSystemMetrics(SM_CYSCREEN);
  12.      Dc:= GetDC(GetDesktopWindow);
  13.      try
  14.        BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY);
  15.      finally
  16.        ReleaseDC(GetDesktopWindow,Dc);
  17.      end;
  18.      SaveToFile(Filename);
  19.    end;
  20.  finally
  21.    Bmp.free;
  22.  end;
  23. end;


Para guardarla como jpg:

delphi
  1. uses Jpeg;
  2.  
  3. procedure GuardarPantalla(Filename: String);
  4. var
  5.  DC: HDC;
  6.  Bmp: Tbitmap;
  7.  Jpg: TJPEGImage;
  8. begin
  9.  Bmp:= TBitmap.Create;
  10.  Jpg:= TJPEGImage.Create;
  11.  try
  12.    with Bmp do
  13.    begin
  14.      Width:= GetSystemMetrics(SM_CXSCREEN);
  15.      Height:= GetSystemMetrics(SM_CYSCREEN);
  16.      Dc:= GetDC(GetDesktopWindow);
  17.      try
  18.        BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY);
  19.      finally
  20.        ReleaseDC(GetDesktopWindow,Dc);
  21.      end;
  22.    end;
  23.    with Jpg do
  24.    begin
  25.      Assign(Bmp);
  26.      CompressionQuality:= 60;
  27.      Compress;
  28.      SaveToFile(Filename);
  29.    end;
  30.  finally
  31.    Bmp.free;
  32.    Jpg.free;
  33.  end;
  34. end;


Para copiarla al portapapeles:

delphi
  1. uses Clipbrd;
  2.  
  3. procedure GuardarPantalla;
  4. var
  5.  DC: HDC;
  6.  Bmp: Tbitmap;
  7. begin
  8.  Bmp:= TBitmap.Create;
  9.  try
  10.    with Bmp do
  11.    begin
  12.      Width:= GetSystemMetrics(SM_CXSCREEN);
  13.      Height:= GetSystemMetrics(SM_CYSCREEN);
  14.      Dc:= GetDC(GetDesktopWindow);
  15.      try
  16.        BitBlt(Canvas.Handle, 0, 0, Width, Height, Dc, 0, 0, SRCCOPY);
  17.      finally
  18.        ReleaseDC(GetDesktopWindow,Dc);
  19.      end;
  20.      Clipboard.Assign(Bmp);
  21.    end;
  22.  finally
  23.    Bmp.free;
  24.  end;
  25. end;

 
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 09 January 2009 - 04:23 PM

Gracias seoane eso está mucho mejor :o (y)

Saludos.
  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 09 January 2009 - 04:27 PM

Hola
Muy bien.
Ahora: Como y donde pongo esto?.
Ejemplito amigo, ejemplito. :D
Saludos
EDITO: Ya vi el de Seoane, No dije nada,...... :D :D :D
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 09 January 2009 - 04:30 PM

Hola
Muy bien.
Ahora: Como y donde pongo esto?.
Ejemplito amigo, ejemplito. :D
Saludos
EDITO: Ya vi el de Seoane, No dije nada,...... :D :D :D


jajajaja, a parte de los ejemplos de seoane, los míos los podías colocar en un Button o en cualquier evento. ;)
  • 0

#8 MasterXP

MasterXP

    Member

  • Miembros
  • PipPip
  • 13 posts
  • LocationRepública Dominicana

Posted 11 January 2009 - 12:37 AM

woooow que codigo mas practico. Gracias amigos.
  • 0

#9 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 25 June 2009 - 08:44 PM

Como se haria en ves de usar BitBlt, usando GetDIBits? lo mismo tomando el Print Screen.

Gracias
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 25 June 2009 - 08:58 PM

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
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 26 June 2009 - 04:34 AM

Bienvenido c0lo, El problema es que GetDIBits y BitBlt son APIS distintas. Mientras BitBlt te sirve para copiar una imagen de un DC a otro, GetDIBits te sirve para ontener en un buffer la imagen desde un Handle gráfico y no desde un DC.

Saludos.
  • 0

#12 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 26 June 2009 - 03:04 PM

egostar, gracias por recibirme.
escafandra, gracias por la invitacion amigo :D.

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:


c
  1. #include<windows.h>
  2. #include<stdio.h>
  3.  
  4. void TakeScreenie(char* filename)
  5. {
  6.  
  7. keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
  8. keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  9.  
  10. HBITMAP h;
  11. OpenClipboard(NULL);
  12.  
  13. h = (HBITMAP)GetClipboardData(CF_BITMAP);
  14.  
  15. HDC hdc = NULL;
  16.  
  17. FILE* fp = NULL;
  18. LPVOID pBuf = NULL;
  19. BITMAPINFO bmpInfo;
  20. BITMAPFILEHEADER bmpFileHeader;
  21.  
  22. do
  23. {
  24.   hdc = GetDC(NULL);
  25.   ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
  26.   bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  27.   GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
  28.  
  29.   if(bmpInfo.bmiHeader.biSizeImage <= 0)
  30.     bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
  31.  
  32.   if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) == NULL)
  33.   {
  34.   MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
  35.   break;
  36.   }
  37.  
  38.   bmpInfo.bmiHeader.biCompression=BI_RGB;
  39.   GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
  40.  
  41.   if((fp = fopen(filename,"wb"))==NULL)
  42.   {
  43.   MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
  44.   break;
  45.   }
  46.  
  47.   bmpFileHeader.bfReserved1 = 0;
  48.   bmpFileHeader.bfReserved2 =0;
  49.   bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
  50.   bmpFileHeader.bfType = 'MB';
  51.   bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  52.  
  53.   fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
  54.   fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
  55.   fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);
  56. } while(false);
  57.  
  58.   if(hdc)ReleaseDC(NULL,hdc);
  59.   if(pBuf) free(pBuf);
  60.   if(fp)fclose(fp);
  61.  
  62.   EmptyClipboard();
  63.   CloseClipboard();
  64. }
  65.  
  66.  
  67. int main()
  68. {
  69.   while (1)TakeScreenie("test.jpg");
  70.   return 0;
  71. }



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
  • 0

#13 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 26 June 2009 - 05:15 PM

¿Por que no te gusta la funcion Bitblt?  :^)
  • 0

#14 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 27 June 2009 - 01:24 AM

No es que no me guste, solo que en ciertas aplicaciones dirigidas a otro entorno dicha Api esta bloqueada, o por mania, por no hacer lo mismo :p.

Mas opto yo, por un enterno donde el cual no puedo usar dicha Api y hay que adaptarse a el, sin ella.
  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 28 June 2009 - 03:11 PM

Tras tratar de compilar el código que expone c0lo y comprobar que no funcionaba, he realizado pequeños cambios para compilarlo con el Builder.

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.



cpp
  1. #include<windows.h>
  2. #include<stdio.h>
  3.  
  4. void TakeScreenie(char* filename)
  5. {
  6.   keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
  7.   keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  8.  
  9.   HBITMAP h;
  10.   OpenClipboard(NULL);
  11.  
  12.   h = (HBITMAP)GetClipboardData(CF_BITMAP);
  13.   HDC hdc = NULL;
  14.  
  15.   FILE* fp = NULL;
  16.   LPVOID pBuf = NULL;
  17.   BITMAPINFO bmpInfo;
  18.   BITMAPFILEHEADER bmpFileHeader;
  19.  
  20.   hdc = GetDC(NULL);
  21.   ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
  22.   bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  23.   GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
  24.  
  25.   if(bmpInfo.bmiHeader.biSizeImage <= 0)
  26.       bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
  27.  
  28.   if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) == NULL){
  29.     MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
  30.     return;
  31.   }
  32.   bmpInfo.bmiHeader.biCompression=BI_RGB;
  33.   GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
  34.  
  35.   if((fp = fopen(filename,"wb"))==NULL){
  36.     MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
  37.     return;
  38.   }
  39.  
  40.   bmpFileHeader.bfReserved1 = 0;
  41.   bmpFileHeader.bfReserved2 =0;
  42.   bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
  43.   bmpFileHeader.bfType = 'BM';  //0x4D42
  44.   bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  45.  
  46.   fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
  47.   fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
  48.   fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);
  49.  
  50.   if(hdc)ReleaseDC(NULL,hdc);
  51.   if(pBuf) free(pBuf);
  52.   if(fp)fclose(fp);
  53.  
  54.   EmptyClipboard();
  55.   CloseClipboard();
  56. }
  57.  
  58.  
  59. int main()
  60. {
  61.   TakeScreenie("test.bmp");
  62.   return 0;
  63. }



Saludos.


  • 1

#16 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 29 June 2009 - 07:09 AM

Una rápida aproximación a delphi, sin mucho control de errores, seria mas o menos así­:


delphi
  1. program Project1;
  2.  
  3. uses
  4.   Windows,
  5.   SysUtils;
  6.  
  7.  
  8. procedure TakeScreenie(filename: String);
  9. var
  10.   hdc: Integer;
  11.   h: HBITMAP;
  12.   pBuf: pointer;
  13.   fp: HFILE;
  14.   bmpInfo: BITMAPINFO;
  15.   bmpFileHeader: BITMAPFILEHEADER;
  16.   ofs : OFSTRUCT;
  17.   wd: DWORD;
  18. begin
  19.  
  20.   keybd_event(VK_SNAPSHOT, $45, KEYEVENTF_EXTENDEDKEY, 0);
  21.   sleep(100);
  22.   keybd_event(VK_SNAPSHOT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  23.  
  24.   OpenClipboard(0);
  25.  
  26.   h := GetClipboardData(CF_BITMAP);
  27.  
  28.  
  29.   hdc := GetDC(0);
  30.   ZeroMemory(@bmpInfo, sizeof(BITMAPINFO));
  31.   bmpInfo.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  32.   GetDIBits(hdc, h, 0, 0, nil, bmpInfo, DIB_RGB_COLORS);
  33.  
  34.   if bmpInfo.bmiHeader.biSizeImage <= 0 then
  35.       bmpInfo.bmiHeader.biSizeImage := bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)Shr 3;
  36.  
  37.   pBuf := AllocMem(bmpInfo.bmiHeader.biSizeImage);
  38.  
  39.   bmpInfo.bmiHeader.biCompression:=BI_RGB;
  40.   GetDIBits(hdc, h, 0, bmpInfo.bmiHeader.biHeight, pBuf, bmpInfo, DIB_RGB_COLORS);
  41.  
  42.   fp:=OpenFile(Pchar(filename), ofs, OF_CREATE or OF_WRITE);
  43.  
  44.   bmpFileHeader.bfReserved1 := 0;
  45.   bmpFileHeader.bfReserved2 :=0;
  46.   bmpFileHeader.bfSize := sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
  47.   bmpFileHeader.bfType := $4D42;
  48.   bmpFileHeader.bfOffBits := sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  49.  
  50.   WriteFile(fp, bmpFileHeader, sizeof(BITMAPFILEHEADER),wd, nil);
  51.   WriteFile(fp, bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER),wd,nil);
  52.  
  53.   WriteFile(fp, pBuf^, bmpInfo.bmiHeader.biSizeImage,wd,nil);
  54.  
  55.  
  56.   if hdc<>0 then ReleaseDC(0, hdc);
  57.   if pBuf<> nil then FreeMem(pBuf);
  58.   if fp<>0 then CloseHandle(fp);
  59.  
  60.   EmptyClipboard();
  61.   CloseClipboard();
  62.  
  63. end;
  64.  
  65.  
  66. begin
  67.   TakeScreenie('test.bmp');
  68. end.


Saludos.
  • 1

#17 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 29 June 2009 - 02:51 PM

Muchas Gracias :D
:kiss:
  • 0

#18 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 29 June 2009 - 03:03 PM

Muchas Gracias :D
:kiss:


jajajajaja,  :shocked:
  • 0

#19 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 29 June 2009 - 03:32 PM

Muchas Gracias :D
:kiss:


Bueno, bueno, no es para tanto.  (h)
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 29 June 2009 - 03:43 PM


Muchas Gracias :D
:kiss:


Bueno, bueno, no es para tanto.  (h)


Ah joder, estos iconos nuevos si que son un peligro :D :D :D

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.