Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

obtener coordenada de un click en otra ventana

5 views
Skip to first unread message

rulo

unread,
May 14, 2012, 6:10:10 AM5/14/12
to
¡ 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

Cholo Lennon

unread,
May 14, 2012, 10:28:05 AM5/14/12
to
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/library/windows/desktop/ms644990(v=vs.85).aspx

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

Saludos

--
Cholo Lennon
Bs.As.
ARG

Hernán

unread,
May 15, 2012, 6:10:47 PM5/15/12
to
"rulo" <nospam_r...@gmail.com.invalid> escribió en el mensaje de
noticias news:lYudncPeepO...@giganews.com...
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.

Cholo Lennon

unread,
May 17, 2012, 9:48:13 AM5/17/12
to
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)

Hernán

unread,
May 20, 2012, 12:07:09 PM5/20/12
to
"Cholo Lennon" <cholo...@hotmail.com> escribió en el mensaje de
noticias news:jp30no$gbn$1...@speranza.aioe.org...
> On 15/05/2012 19:10, Hernán wrote:
>> "rulo" <nospam_r...@gmail.com.invalid> escribió en el mensaje de
>> noticias news:lYudncPeepO...@giganews.com...

> 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.

0 new messages