[C++]Ayuda con un programa funcion getpixel

Iniciado por Ahustinkrone, 30 Mayo 2014, 22:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Ahustinkrone

Holas, estoy intentando crear un programa que obtenga el valor rgb o bgr de un pixel especifico en la ventana activa que no seria la del programa en si.
osea yo quiero que revise el pixel que esta en X, Y y me diga que color es cada x tiempo.
el problema es que no entiendo como funciona getpixel(hdc,x,y). supongo que x e y son las coordenadas del pixel a revisar pero ¿hdc?.. sino alguien me puede explicar como utilitaria getpixel para lo que necesito ?
Trabajo con Code:Blocks y ya linkie gdi32.
PD: es mi primera post ^^

x64core

Cita de: Ahustinkrone en 30 Mayo 2014, 22:00 PM
Holas, estoy intentando crear un programa que obtenga el valor rgb o bgr de un pixel especifico en la ventana activa que no seria la del programa en si.
osea yo quiero que revise el pixel que esta en X, Y y me diga que color es cada x tiempo.
el problema es que no entiendo como funciona getpixel(hdc,x,y). supongo que x e y son las coordenadas del pixel a revisar pero ¿hdc?.. sino alguien me puede explicar como utilitaria getpixel para lo que necesito ?
Trabajo con Code:Blocks y ya linkie gdi32.
PD: es mi primera post ^^
GetDC ( Hwnd ) http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx.
Hay otras maneras también. Y Además mejor cambia de compilador a VC++ ( Visual Studio ).

vangodp

HDC = Handle to Device Context
No se mucho de win api pero se que para poder dibujar en windows necesitas un Device Context.
El Handle es lo que maneja el Device Context.
Digamos que una ventana es un Device Context cuando creas un hdc
le asignas a una DC para poder ser manejado.

Es como cuando creas una variable y después le asignas el valor que va a guardar.
hdc es la variable y en ella guardamos la ventana DC.

por ejemplo:

HDC hdc = GetDC ( NULL );

HDC es el tipo de dato
hdc   es el nombre que le damos
GetDC ( NULL ); asigna a hdc la una ventana.

En fin hdc es un puntero a un ventana DC.






Ahustinkrone

Cita de: x64Core en 31 Mayo 2014, 03:14 AM
GetDC ( Hwnd ) http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx.
Hay otras maneras también. Y Además mejor cambia de compilador a VC++ ( Visual Studio ).
porque me lo recomiendas ? que caracterusticas presenta mejores/distantas al code::blocks?

Volviendo al tema,mire varios ejemplos del uso del HDC y pude entenderlo un poco, gracias a los 2 por sus repuestas, voy a probar con GetDC (NULL);estaba usando GetWindowDC(hwnd); para seleccionar la ventana donde posicione el puntero, pero creo que seria mas estable si utiliza la pantalla entera ¿no?.
ahora otra duda, si getpixel se utilisa en una ventana seleccionada y no en toda la pantalla el origen de las coordenadas X e Y  es la esquina de la ventana o de la pantalla ?

quiero comentar (por si a alguien le interesa)que el programa que estoy haciendo es un autopot para juegos, bastante sencillo y simplemente como hobbie porque no quería bajar uno, quería hacer uno :D funciona asi:
1-Inicia el programa
2-(una vez dentro de la ventana del juego) Alt + click para marcar en la barra de vida/mana/etc el punto en el que quieres que se empiecen a utilizar o dejen de utilizarse las pociones.
3-se guarda el color original de este pixel.
4-analiza el pixel seleccionado si este cambia de color se empiezan a utilizar las pociones con un cierto intervalo(simula presionar una tecla).
5-si el pixel vuelve a su color original deja de utilizar pociones.


eso es todo, bastante sencillo. ya esta casi terminado. gracias espero sus respuestas

vangodp

Citarporque me lo recomiendas ? que caracterusticas presenta mejores/distantas al code::blocks?
Es que estas trabajando con winapi, y para eso por supuesto que es mejor, pero tampoco eres obligado a cambiar y por eso es una recomendación.
Aquí hay un código que si me funciono.
Si le haces unas modificaciones y lo pones en un bucle te puede servir para lo que quieres.
http://stackoverflow.com/questions/4839623/getting-pixel-color-in-c
Busca aprender sobre la api de windows si te interesa el tema ;)
Suerte.

Ahustinkrone

#5
Gracias, la pregunta de "porque me lo recomendabas?" no iba de malas, de verdad quería saber en que era mejor el visual.
y..
#include <windows.h>
#include <stdio.h>
using namespace std;
HDC dcx;
int x;
int y;
int Color;
int capturarcoord = 1;
int full;
int main()
{
   while (capturarcoord == 1){
           if (GetAsyncKeyState(164) && GetAsyncKeyState(18) && GetAsyncKeyState(1)){
               HWND hwnd; // el manejador de la ventana a trabajar
               POINT pt;                   // Puntero para las cordenadas
               GetCursorPos(&pt);                // La funcion que dara las cordenadas
               hwnd2 = WindowFromPoint(pt); // la funcion que capta la ventana
               dcx =GetWindowDC(hwnd);
               x = pt.x;
               y = pt.y;
               capturarcoord = 0;
               printf("Coordenas Seteadas!X=%i Y=%i\n\n\n",x,y);
           }
   }
   full = GetPixel(ventana,x,y);
   while (1<2){
       printf("Pixel Check in \(%i,%i\) normal-value=%i\n",x,y,full);
       Color = GetPixel(dcx,x,y);
       if (full != Color){keybd_event(VK_F10,0x79,0 , 0);keybd_event(VK_F10,0x79,KEYEVENTF_KEYUP , 0);printf("Funciona!");}
       printf("%i\(10\) = %x\(16\)\n",Color,Color);
       Sleep(380);
   }
   return 0;
}


Eso es lo hice hasta ahora, faltan algunas modificaciones para hacerlo mas bello y configurable pero el motor funciona correctamente, doy el tema por resuelto. gracias por sus respuestas :D