obtener coordenada de un click en otra ventana

14/05/2012 - 12:10 por rulo | Informe spam
¡ Hola ! no soy muy experimentado en esto. Necesito hacer un codigo que obtenga las coordenadas del clic en otra ventana que no es la del programa que estoy ejecutando. Por ejemplo tengo corriendo mi programa y tambien abro el Paint. si hago clic en este ultimo mi programa debe captar las coordenadas de ese clic. no se si esto es posible. estuve leyendo mfc pero no encuentro la manera. gracias

Preguntas similare

Leer las respuestas

#1 Cholo Lennon
14/05/2012 - 16:28 | Informe spam
On 14/05/2012 07:10, rulo wrote:
¡ Hola ! no soy muy experimentado en esto. Necesito hacer un codigo que
obtenga las coordenadas del clic en otra ventana que no es la del programa que
estoy ejecutando. Por ejemplo tengo corriendo mi programa y tambien abro el
Paint. si hago clic en este ultimo mi programa debe captar las coordenadas de
ese clic. no se si esto es posible. estuve leyendo mfc pero no encuentro la
manera. gracias



Mediante la API GetCursorPos puedes obtener la posicion del cursor.
Ahora si quieres capturar los mensajes (clic, doble clic, etc) que estan
recibiendo otras ventanas que no pertenezcan a tu proceso deberas
instalar un hook, lo cual requiere usar la API SeWindowsHookEx entre
otras cosas.

http://msdn.microsoft.com/en-us/lib...p/ms644990(v=vs.85).aspx

En internet hay muchos y variados ejemplos sobre como instalar
correctamente un hook.

Saludos

Cholo Lennon
Bs.As.
ARG
Respuesta Responder a este mensaje
#2 rulo
14/05/2012 - 23:34 | Informe spam
Cholo Lennon escribió el 14/05/2012 16:28 :
On 14/05/2012 07:10, rulo wrote:
¡ Hola ! no soy muy experimentado en esto. Necesito hacer un codigo que
obtenga las coordenadas del clic en otra ventana que no es la del programa que
estoy ejecutando. Por ejemplo tengo corriendo mi programa y tambien abro el
Paint. si hago clic en este ultimo mi programa debe captar las coordenadas de
ese clic. no se si esto es posible. estuve leyendo mfc pero no encuentro la
manera. gracias




Mediante la API GetCursorPos puedes obtener la posicion del cursor.
Ahora si quieres capturar los mensajes (clic, doble clic, etc) que estan
recibiendo otras ventanas que no pertenezcan a tu proceso deberas
instalar un hook, lo cual requiere usar la API SeWindowsHookEx entre
otras cosas.

http://msdn.microsoft.com/en-us/lib...p/ms644990(v=vs.85).aspx

En internet hay muchos y variados ejemplos sobre como instalar
correctamente un hook.

Saludos

Cholo Lennon
Bs.As.
ARG


muy interesante, ya había leído algo de eso. voy a investigar con mas profundidad. muchísimas gracias
Respuesta Responder a este mensaje
#3 Hernán
16/05/2012 - 00:10 | Informe spam
"rulo" escribió en el mensaje de
noticias news:
¡ Hola ! no soy muy experimentado en esto. Necesito hacer un codigo que
obtenga las coordenadas del clic en otra ventana que no es la del
programa que
estoy ejecutando. Por ejemplo tengo corriendo mi programa y tambien
abro el
Paint. si hago clic en este ultimo mi programa debe captar las
coordenadas de
ese clic. no se si esto es posible. estuve leyendo mfc pero no
encuentro la
manera. gracias




O también puedes registrar la ventana para recibir raw input

RAWINPUTDEVICE rid[] = {1, 2, RIDEV_INPUTSINK, hWnd};
RegisterRawInputDevices(rid, 1, sizeof(RAWINPUTDEVICE));

y luego capuras la data

case WM_INPUT:
{
unsigned int largo = 0;

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &largo,
sizeof(RAWINPUTHEADER));

if (largo > 0)
{
BYTE *búfer = new BYTE[largo];

if (búfer != NULL)
{
RAWINPUT *ri = (RAWINPUT *)búfer;

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, ri, &largo,
sizeof(RAWINPUTHEADER));

if (ri->header.dwType == RIM_TYPEMOUSE)
{
if ((ri->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) ==
RI_MOUSE_LEFT_BUTTON_DOWN)
{
POINT p;
wchar_t texto[50];

GetCursorPos(&p);
wsprintf(texto, L"X: %d, Y: %d", p.x, p.y);
SetWindowText(hWnd, texto);
}
}

delete [] búfer;
}
}
return 0;
}

Obviamente (¿?) no vamos a interpretar la data del ratón. Llamamos a
GetCursorPos y ya. Astutos.

Todo bien.
Respuesta Responder a este mensaje
#4 Cholo Lennon
17/05/2012 - 15:48 | Informe spam
On 15/05/2012 19:10, Hernán wrote:
"rulo" escribió en el mensaje de
noticias news:
¡ Hola ! no soy muy experimentado en esto. Necesito hacer un codigo que
obtenga las coordenadas del clic en otra ventana que no es la del
programa que
estoy ejecutando. Por ejemplo tengo corriendo mi programa y tambien
abro el
Paint. si hago clic en este ultimo mi programa debe captar las
coordenadas de
ese clic. no se si esto es posible. estuve leyendo mfc pero no
encuentro la
manera. gracias




O también puedes registrar la ventana para recibir raw input

RAWINPUTDEVICE rid[] = {1, 2, RIDEV_INPUTSINK, hWnd};
RegisterRawInputDevices(rid, 1, sizeof(RAWINPUTDEVICE));

y luego capuras la data

case WM_INPUT:
{
unsigned int largo = 0;

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &largo,
sizeof(RAWINPUTHEADER));

if (largo > 0)
{
BYTE *búfer = new BYTE[largo];

if (búfer != NULL)
{
RAWINPUT *ri = (RAWINPUT *)búfer;

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, ri, &largo,
sizeof(RAWINPUTHEADER));

if (ri->header.dwType == RIM_TYPEMOUSE)
{
if ((ri->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) => RI_MOUSE_LEFT_BUTTON_DOWN)
{
POINT p;
wchar_t texto[50];

GetCursorPos(&p);
wsprintf(texto, L"X: %d, Y: %d", p.x, p.y);
SetWindowText(hWnd, texto);
}
}

delete [] búfer;
}
}
return 0;
}

Obviamente (¿?) no vamos a interpretar la data del ratón. Llamamos a
GetCursorPos y ya. Astutos.

Todo bien.



Hola Hernan, tanto tiempo!

Mmmm... interesante solucion :-) sobre todo para no entrar en el tema de
hooks, que a veces puede ser medio molesto, sobre todo aquellos globales
que requieren ser implementados en una dll con datos compartidos (para
poder ser inyectados en el proceso a monitorear)

Saludos


Cholo Lennon
Bs.As.
ARG
Respuesta Responder a este mensaje
#5 Hernán
20/05/2012 - 18:07 | Informe spam
"Cholo Lennon" escribió en el mensaje de
noticias news:jp30no$gbn$
On 15/05/2012 19:10, Hernán wrote:
"rulo" escribió en el mensaje de
noticias news:



Hola Hernan, tanto tiempo!

Mmmm... interesante solucion :-) sobre todo para no entrar en el tema
de hooks, que a veces puede ser medio molesto, sobre todo aquellos
globales que requieren ser implementados en una dll con datos
compartidos (para poder ser inyectados en el proceso a monitorear)

Saludos





Buen día Cholo,

Sí. Aunque en este ejemplillo se lo usa casi exclusivamente para
capturar la "interrupción", el SO te brinda la posibilidad de hacerte
fácilmente de la data cruda. Después uno verá como la cocina. Leyendo la
ayuda se ve que uno puede recolectar la data que entra por el micrófono
o por alguna camarita.

O, por ejemplo se me ocurre ahora, los lectores de código de barras que
emulan al teclado, los podría leer sin tener que estar pendiente del
foco en algún control.

Saludos.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida