Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: engel lex en 8 Julio 2010, 03:32 am



Título: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 03:32 am
Buenas, estoy migrando a c++, ya he aprendido un poco y quiero aprender a realizar la captura de pantalla, sin necesidad de simular la pulsación del botón...

Si alguien me podría ayudar, he ya buscando en el foro sobre captura de pantalla en c/c++ y no me arrojó resultados...

De antemano, se los agradezco mucho   :-\


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: nicolas_cof en 8 Julio 2010, 03:33 am
engelx, te dejo un post de sources interesantes, creo haber visto uno o dos sobre lo que pedis...

https://foro.elhacker.net/programacion_cc/recopilatorio_sources_interesantes-t298479.0.html

Salu10.


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 04:09 am
Wow la recopilacion de codigos está buena, luego revisaré los otros... pero sigo estancado en el mismo... tengo estos problemas:

Citar
 [Linker error] undefined reference to `GetObjectA@12'
 C:\Users\Engel\AppData\Local\Temp\cccpbaaa.o(.text+0x2a8) In function `Z10SaveBitmapPcP13tagBITMAPINFOP9HBITMAP(HDC__ *)':
  [Linker error] undefined reference to `GetDIBits@28'
 C:\Users\Engel\AppData\Local\Temp\cccpbaaa.o(.text+0x47a) In function `Z15CapturaPantallajjjjPc':
  [Linker error] undefined reference to `CreateCompatibleDC@4'
  [Linker error] undefined reference to `CreateCompatibleBitmap@12'
  [Linker error] undefined reference to `SelectObject@8'
  [Linker error] undefined reference to `BitBlt@36'
  [Linker error] undefined reference to `StretchBlt@44'
  [Linker error] undefined reference to `SelectObject@8'
  [Linker error] undefined reference to `GetBitmapBits@12'
  [Linker error] undefined reference to `CreateCompatibleBitmap@12'
  [Linker error] undefined reference to `SetBitmapBits@12'
  [Linker error] undefined reference to `DeleteDC@4'
  [Linker error] undefined reference to `DeleteObject@4'
 C:\Users\Engel\AppData\Local\Temp\cccpbaaa.o(.text+0x47a) ld returned 1 exit status


y hasta ahí llegó mi nivel en C++  :-\
como resuelvo con el linker esos errores? al parecer a todo el mundo le sale genialmente el código menos a mi... a continuación están los códigos usados

HELP!!! :huh:



Código:
#include <iostream>
#include <cstdlib>
#include "shot.h"

using namespace std;

int main(/*int argc, char *argv[]*/)
{
    int x = GetSystemMetrics(SM_CXSCREEN);
    int y = GetSystemMetrics(SM_CYSCREEN);

            CapturaPantalla(0,0,x,y,"D:\\hola.bmp");



    system("PAUSE");
    return EXIT_SUCCESS;
}

y mi shot.h es

Código:
#include <windows.h>

PBITMAPINFO CreateBitmapInfoStructure(HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;

//obtiene la altura, anchura, y profundidad del color de la imagen
if(!GetObject(hBmp,sizeof(BITMAP),(LPSTR)&bmp))return NULL;

cClrBits = 24;

/*
reserva la memoria para la estructura PBITMAPINFO, que contendrá la informacion
de la cabecera
*/
if(cClrBits!=24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));

//inicializa la estructura
pbmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = 24;

if(cClrBits<24)pbmi->bmiHeader.biClrUsed=(1<<cClrBits);

pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth+7)/8*pbmi->bmiHeader.biHeight*cClrBits;
pbmi->bmiHeader.biClrImportant = 0;

return pbmi;
}

HRESULT SaveBitmap(char strFileName[128],PBITMAPINFO pbi,HBITMAP hBMP,HDC hDC)
{
HRESULT hr = E_FAIL;
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memorypointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp; // temp-variable


if(pbi==NULL)return E_FAIL;

pbih=(PBITMAPINFOHEADER)pbi;
lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);

if(!lpBits)return E_FAIL;

if(!GetDIBits(hDC,hBMP,0,(WORD)pbih->biHeight,lpBits,pbi,DIB_RGB_COLORS))return E_FAIL;

//crea el .bmp
hf=CreateFile(strFileName,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);

if(hf==INVALID_HANDLE_VALUE)return E_FAIL;

hdr.bfType = 0x4D42; // 0x42 = "B", 0x4D = "M"


hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;

hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD);


if(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,NULL))return E_FAIL;

if(!WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed*sizeof(RGBQUAD),(LPDWORD)&dwTmp,(NULL)))return E_FAIL;


dwTotal=cb=pbih->biSizeImage;
hp=lpBits;

if(!WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwTmp,NULL))return E_FAIL;
if(!CloseHandle(hf))return E_FAIL;

GlobalFree((HGLOBAL)lpBits);

return S_OK;
}

/*
uso: CapturaPantalla(posicion_inicial_x,posicion_inicial_y,posicion_final_x,posicion_final_y);
*/

void CapturaPantalla(unsigned int Ax,unsigned int Ay,unsigned int Bx,unsigned int By,char *Ruta)
{
BYTE *mem;
int bpp,c;
    HWND HwndSrc;
    HDC HdcSrc;
    HDC HdcMemory;
    HDC HdcStrech;
    HBITMAP Hbmp;
    HBITMAP HbmpStrech;
    HBITMAP HbmpPrev;
    HBITMAP HbmpPrevStrech;
    HBITMAP BmpPrueba;

HwndSrc=GetDesktopWindow();                               //almacena el manejador del escritorio
    HdcSrc=GetWindowDC(HwndSrc);                               //se obtiene el DC del escritorio
HdcMemory=CreateCompatibleDC(HdcSrc);                      //se crea una copia del DC del escritorio
HdcStrech=CreateCompatibleDC(HdcSrc);                   //Cd que almacenara la imagen pequeña
Hbmp=CreateCompatibleBitmap(HdcSrc,1024,768);          //se cra un bitmap del DC del escritorio
HbmpStrech=CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);  //bitmap que almacenara el Strech
HbmpPrev=(HBITMAP)SelectObject(HdcMemory,Hbmp);        //se asocia el bitmap con el DC
HbmpPrevStrech=(HBITMAP)SelectObject(HdcStrech,HbmpStrech);

BitBlt(HdcMemory,0,0,800,600,HdcSrc,Ax,Ay,SRCCOPY);
    StretchBlt(HdcStrech,0,0,800,600,HdcMemory,0,0,800,600,SRCCOPY);
    HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
    Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);

bpp=800*600*8;

c=GetBitmapBits(HbmpStrech,0,0);
mem=(BYTE*)malloc((c-1)*sizeof(BYTE*));
memset(mem,0,sizeof(mem));

    GetBitmapBits(HbmpStrech,c,mem);
BmpPrueba = CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);
SetBitmapBits(BmpPrueba,c,mem);
SaveBitmap(Ruta,CreateBitmapInfoStructure(BmpPrueba),BmpPrueba,HdcSrc);

    DeleteDC(HdcSrc);
    DeleteDC(HdcMemory);
    DeleteDC(HdcStrech);
    DeleteObject(Hbmp);
    DeleteObject(HbmpPrev);
    DeleteObject(HbmpStrech);
    DeleteObject(HbmpPrevStrech);

return;
}





Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: nicolas_cof en 8 Julio 2010, 04:16 am
Cambia esto...

Código:
#include <shot.h>

por esto...

Código:
#include "shot.h"

Y dentro de shot.h agrega esta linea

Código:
#include <windows.h>

y ya no haria falta que la pongas en el archivo que contiene el main()

Salu10.


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 04:22 am
Exactamente el mismo error  :-\
el linker echando broma


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: nicolas_cof en 8 Julio 2010, 04:26 am
Viendo de nuevo tu codigo, para usar la macro EXIT_SUCCESS debes incluir cstdlib

Código:
#include <cstdlib>

Usa el boton modificar para modificar tu codigo con los cambios hasta ahora hechos

Salu10.


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: Littlehorse en 8 Julio 2010, 04:30 am
Por los errores creo que estas usando devc++.

Tools>compiler options>

Marca donde dice "Agregar estos comandos al linker" (algo así creo que decía) y agregas:

-lgdi32

Debería funcionar.

Saludos


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 04:36 am
littlehorse, cool  ;D eso era lo que necesitaba el linker (si, es dev c++)
nicolas_cof  :D agradezco también mucho tu interés en ayudarme

pero ahora surge un nuevo problema...

 :-(

crea la imagen, pero este captura solo 800x600 y deja el resto en negro (mi pantalla es 1400x900)


si, se que estoy jodiendo mucho, para lo poco que nos conocemos... pero así iré aprendiendo  ;)


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: rob1104 en 8 Julio 2010, 04:43 am
littlehorse, cool  ;D eso era lo que necesitaba el linker (si, es dev c++)
nicolas_cof  :D agradezco también mucho tu interés en ayudarme

pero ahora surge un nuevo problema...

 :-(

crea la imagen, pero este captura solo 800x600 y deja el resto en negro (mi pantalla es 1400x900)


si, se que estoy jodiendo mucho, para lo poco que nos conocemos... pero así iré aprendiendo  ;)
Te limitaste a solo copiar y pegar el código sin leerlo ni entenderlo??

Verifica estas lineas:
Código
  1. BitBlt(HdcMemory,0,0,800,600,HdcSrc,Ax,Ay,SRCCOPY);
  2.    StretchBlt(HdcStrech,0,0,800,600,HdcMemory,0,0,800,600,SRCCOPY);
  3.    HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
  4.    Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);
  5.  
  6. bpp=800*600*8;

Saludos


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 04:56 am
rob1104 wow creía que había modificado eso D: (de hecho el el main le había puesto system metrics, porque estaba para esa resolución, y pensé que había eliminado todas las instancias de esa resolución :s

Sorry  :-( tienes razón en que tal vez no me detuve mucho en el shot.h

modifico eso y otros detalles que ví, y ya posteo el codigo :P


Lh: No hagas doble post, usa el botón modificar!


He aquí el código final...

Espero no tener errores... en los comentarios que agregué si alguien ve algo incorrecto, acepto muy bien las correcciones ya que el código no entiendo del todo las implementaciones (disculpen si mi terminología no es la correcta)

El archivo con el main va así

Código:

#include <iostream>
#include <cstdlib>
#include "shot.h"

using namespace std;

int main(/*int argc, char *argv[]*/)
{
    int x = GetSystemMetrics(SM_CXSCREEN);
    int y = GetSystemMetrics(SM_CYSCREEN);

            //CapturaPantalla(200,200,500,500,"L:\\hola.bmp"); //Capturar crop xi,yi,xf,yf (xi=x inicial, yf=y final)

            //CapturaPantalla(0,0,x,y,"L:\\hola.bmp"); // para capturar pantalla completa


    //system("PAUSE");
    return EXIT_SUCCESS;
}




El shot.h es este


Código:
#include <windows.h>


PBITMAPINFO CreateBitmapInfoStructure(HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;

//obtiene la altura, anchura, y profundidad del color de la imagen
if(!GetObject(hBmp,sizeof(BITMAP),(LPSTR)&bmp))return NULL;

cClrBits = 24;

/*
reserva la memoria para la estructura PBITMAPINFO, que contendrá la informacion
de la cabecera
*/
if(cClrBits!=24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));

//inicializa la estructura
pbmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = 24;

if(cClrBits<24)pbmi->bmiHeader.biClrUsed=(1<<cClrBits);

pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth+7)/8*pbmi->bmiHeader.biHeight*cClrBits;
pbmi->bmiHeader.biClrImportant = 0;

return pbmi;
}

HRESULT SaveBitmap(char strFileName[128],PBITMAPINFO pbi,HBITMAP hBMP,HDC hDC)
{
HRESULT hr = E_FAIL;
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memorypointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp; // temp-variable


if(pbi==NULL)return E_FAIL;

pbih=(PBITMAPINFOHEADER)pbi;
lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);

if(!lpBits)return E_FAIL;

if(!GetDIBits(hDC,hBMP,0,(WORD)pbih->biHeight,lpBits,pbi,DIB_RGB_COLORS))return E_FAIL;

//crea el .bmp
hf=CreateFile(strFileName,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);

if(hf==INVALID_HANDLE_VALUE)return E_FAIL;

hdr.bfType = 0x4D42; // 0x42 = "B", 0x4D = "M"


hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;

hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD);


if(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,NULL))return E_FAIL;

if(!WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed*sizeof(RGBQUAD),(LPDWORD)&dwTmp,(NULL)))return E_FAIL;


dwTotal=cb=pbih->biSizeImage;
hp=lpBits;

if(!WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwTmp,NULL))return E_FAIL;
if(!CloseHandle(hf))return E_FAIL;

GlobalFree((HGLOBAL)lpBits);

return S_OK;
}

/*
uso: CapturaPantalla(posicion_inicial_x,posicion_inicial_y,posicion_final_x,posicion_final_y);
*/

void CapturaPantalla(unsigned int Ax,unsigned int Ay,unsigned int Bx,unsigned int By,char *Ruta)
{
BYTE *mem;
int bpp,c;
    HWND HwndSrc;
    HDC HdcSrc;
    HDC HdcMemory;
    HDC HdcStrech;
    HBITMAP Hbmp;
    HBITMAP HbmpStrech;
    HBITMAP HbmpPrev;
    HBITMAP HbmpPrevStrech;
    HBITMAP BmpPrueba;
    int Cx,Cy;
    Cx=Bx-Ax;
    Cy=By-Ay;
HwndSrc=GetDesktopWindow();                               //almacena el manejador del escritorio
    HdcSrc=GetWindowDC(HwndSrc);                               //se obtiene el DC del escritorio
HdcMemory=CreateCompatibleDC(HdcSrc);                      //se crea una copia del DC del escritorio
HdcStrech=CreateCompatibleDC(HdcSrc);                   //Cd que almacenara la imagen pequeña
Hbmp=CreateCompatibleBitmap(HdcSrc,Cx,Cy);          //se cra un bitmap del DC del escritorio
//toma desde la posision 0,0 hasta x,y
HbmpStrech=CreateCompatibleBitmap(HdcSrc,Cx,Cy);  //bitmap que almacenara el Strech
//modficacion produce un aparente error de sincrinizacion (aparentemente tangencial al sumar o restar un valor)
//el error de sincronizacion es cuando disconcuerda los numeros con BmpPrueba
HbmpPrev=(HBITMAP)SelectObject(HdcMemory,Hbmp);        //se asocia el bitmap con el DC
HbmpPrevStrech=(HBITMAP)SelectObject(HdcStrech,HbmpStrech);

BitBlt(HdcMemory,0,0,Cx,Cy,HdcSrc,Ax,Ay,SRCCOPY);
//El primer par de cordenadas toma la posicion desde x,y hasta Bx,By
//el segundo par, mueve la imagen x,y posixiones hacia atras

    StretchBlt(HdcStrech,0,0,Bx,By,HdcMemory,0,0,Bx,By,SRCCOPY);
    //aparentemente hace lo mismo que el comando anterior en modificacion
   
    HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
    Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);

bpp=Bx*By*8; //NPI para que sirve ya que ni si quiera está implementado su uso :s
   
c=GetBitmapBits(HbmpStrech,0,0);
mem=(BYTE*)malloc((c-1)*sizeof(BYTE*));
memset(mem,0,sizeof(mem));

    GetBitmapBits(HbmpStrech,c,mem);
BmpPrueba = CreateCompatibleBitmap(HdcSrc,Cx,Cy-0);
//x,y determinan el temaño de la captura
SetBitmapBits(BmpPrueba,c,mem);
SaveBitmap(Ruta,CreateBitmapInfoStructure(BmpPrueba),BmpPrueba,HdcSrc);

    DeleteDC(HdcSrc);
    DeleteDC(HdcMemory);
    DeleteDC(HdcStrech);
    DeleteObject(Hbmp);
    DeleteObject(HbmpPrev);
    DeleteObject(HbmpStrech);
    DeleteObject(HbmpPrevStrech);

return;
}


Mis pseudo análisis (-.- realmente mas por método de caja negra que por cualquier otro método) es en esta sección

Código:

HwndSrc=GetDesktopWindow();                               //almacena el manejador del escritorio
    HdcSrc=GetWindowDC(HwndSrc);                               //se obtiene el DC del escritorio
HdcMemory=CreateCompatibleDC(HdcSrc);                      //se crea una copia del DC del escritorio
HdcStrech=CreateCompatibleDC(HdcSrc);                   //Cd que almacenara la imagen pequeña
Hbmp=CreateCompatibleBitmap(HdcSrc,Cx,Cy);          //se cra un bitmap del DC del escritorio
//toma desde la posision 0,0 hasta x,y
HbmpStrech=CreateCompatibleBitmap(HdcSrc,Cx,Cy);  //bitmap que almacenara el Strech
//modficacion produce un aparente error de sincrinizacion (aparentemente tangencial al sumar o restar un valor)
//el error de sincronizacion es cuando disconcuerda los numeros con BmpPrueba
HbmpPrev=(HBITMAP)SelectObject(HdcMemory,Hbmp);        //se asocia el bitmap con el DC
HbmpPrevStrech=(HBITMAP)SelectObject(HdcStrech,HbmpStrech);

BitBlt(HdcMemory,0,0,Cx,Cy,HdcSrc,Ax,Ay,SRCCOPY);
//El primer par de cordenadas toma la posicion desde x,y hasta Bx,By
//el segundo par, mueve la imagen x,y posixiones hacia atras

    StretchBlt(HdcStrech,0,0,Bx,By,HdcMemory,0,0,Bx,By,SRCCOPY);
    //aparentemente hace lo mismo que el comando anterior en modificacion
   
    HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
    Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);

bpp=Bx*By*8; //NPI para que sirve ya que ni si quiera está implementado su uso :s
   
c=GetBitmapBits(HbmpStrech,0,0);
mem=(BYTE*)malloc((c-1)*sizeof(BYTE*));
memset(mem,0,sizeof(mem));

    GetBitmapBits(HbmpStrech,c,mem);
BmpPrueba = CreateCompatibleBitmap(HdcSrc,Cx,Cy-0);
//x,y determinan el temaño de la captura
SetBitmapBits(BmpPrueba,c,mem);
SaveBitmap(Ruta,CreateBitmapInfoStructure(BmpPrueba),BmpPrueba,HdcSrc);





Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: rob1104 en 8 Julio 2010, 17:39 pm
Tranquilo, hiciste 4 post seguidos y estás pidiendo ayuda de manera desesperada... te pueden llamar la atención por eso.

Debes saber, que la mayoria de las veces que agregas un header externo tienes que enlazar a la libreria estatica para que funcione.

Agrega este parametro al linker de la misma forma que lo hiciste con la otra liberia:

-ljpeg

Saludos y tranquilo que la ayuda llega sola no exigas.


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 18:03 pm
Sorry -.- por fastidiar... ya se que no lo hago

Gracias rob1104 si era eso... -.- despues tendré que ver como rayos soluciono si el linker fastidia mas...

po si alguien quiere el codigo, está publicado :P solo hay que cambiar

#include <jpeg\jpeglib.h> (claro asumiendo que lo consiguieron, si alguien lo necesita le puedo pasar el link de descarga)

extern "C" {
#include <jpeg\jpeglib.h>
}

al parecer esa lib tiene cabacera de c :P

eso si... el programa es un poco lento... problema que ya veré como solucionar luego


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: Horricreu en 8 Julio 2010, 18:18 pm
Mírate este enlace, es un código buenísimo de [Zero]:

Código:
http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_clsscreencapture-t279310.0.html

Saludos :P


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 8 Julio 2010, 20:47 pm
:o con el gdiplus.h yo como no conseguí informacion clara sobre ese, ni lo intenté...

que tal en respecto a velocidad? (el jpeglib me está dando casi 3 segundo en convertir de hbitmap a jpeg  :( :-\ y soy obsesivo con que mis programas sean rápidos :P)

Por cierto... pregunta aparte... veo que los ejecutables de c++ son pesados en disco duro (vengo de trabajar con visual)... esta aplicacion pesa ya casi 1,5mb... como se puede reducir ese peso en lo posible? y cuales son los costes de reducirlo? (es decir, si gasta mas memoria, es mas lento)


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: Horricreu en 8 Julio 2010, 20:56 pm
:o con el gdiplus.h yo como no conseguí informacion clara sobre ese, ni lo intenté...

Vamos inténtalo hombre, es un método muy eficaz, bueno y sabrás otra cosa más :)

Código:
http://msdn.microsoft.com/en-us/library/ms533969.aspx

Saludos :P


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: rob1104 en 8 Julio 2010, 21:30 pm
Citar
Por cierto... pregunta aparte... veo que los ejecutables de c++ son pesados en disco duro (vengo de trabajar con visual)... esta aplicacion pesa ya casi 1,5mb... como se puede reducir ese peso en lo posible? y cuales son los costes de reducirlo? (es decir, si gasta mas memoria, es mas lento)

Read more: http://foro.elhacker.net/programacion_cc/capturar_pantalla_sin_metodo_de_teclado-t299001.0.html#ixzz0t7YKMt3n
Seguro tienes el compilador en modo 'debug', cambialo a modo 'release' y veras la diferencia en peso.

Saludos


Título: Re: Capturar Pantalla (sin método de teclado)
Publicado por: engel lex en 9 Julio 2010, 05:04 am
no se que pasa... con la librería gdiplus (la descargué de codeguru porque aparentemente devc++ no la trae, pero me causa como mil problemas con cada una de las librerías... creo que deben estar malas, porque conseguí una GdiplusEnums.h y resolvió (aparentemente) los problemas con esa librería... pero aun tengo problemas con el resto...  en la pagina de MS solo me dan  la .dll y otra que conseguí, me dá el mismo problema que con la primera que descargué... algún link de ayuda?? en google no consigo nada que me sirva  :-\


Debe haber modos de codificar rápido... paint lo hace en una fracción de segundo... en comparación a los casi 5 segundos que tardo jpeglib


Actualizacion...

Me rendí con la GDI... ninguno de los ejemplos me corre y no logro resolver nada contra el linker... así que me dediqué analizar porque la jpeglib era lenta... y no es la jpeglib... es la manera de pasarle los datos...

Código:
GetPixel(hDCmem, px, py);

este comando está durando mucho mas de lo que me gustaria... así que, si alguien conoce algún simil, u otros metodos que hagan lo mismo me serian util



Actualizaciion 2...

Para los que les parezca interesante el tema... conseguí un modo de hacerla mucho mas rapido... en menos de medio segundo, y es este metodo

Código:
int datasize = Cx*Cy;
COLORREF* lpClrData = (COLORREF*)LocalAlloc(LPTR, datasize * sizeof(COLORREF));
DWORD ds = GetBitmapBits(Hbmp, datasize * sizeof(COLORREF), lpClrData);
eso para pasarlo a memoria y para leerlo

Código:
pixel = lpClrData[100*Cx+100];

lo que hace es tornarlo practicamente un apuntador y sacarlo directo de memoria sin muchas conversiones ni nada, para recorrer la imagen... y es compatible con los metodos de color que venia usando el algoritmo