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:
Mostrar la cita
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
#2 rulo
14/05/2012 - 23:34 | Informe spam
Cholo Lennon escribió el 14/05/2012 16:28 :
Mostrar la cita
muy interesante, ya había leído algo de eso. voy a investigar con mas profundidad. muchísimas gracias
#3 Hernán
16/05/2012 - 00:10 | Informe spam
"rulo" escribió en el mensaje de
noticias news:
Mostrar la cita
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.
#4 Cholo Lennon
17/05/2012 - 15:48 | Informe spam
On 15/05/2012 19:10, Hernán wrote:
Mostrar la cita
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
#5 Hernán
20/05/2012 - 18:07 | Informe spam
"Cholo Lennon" escribió en el mensaje de
noticias news:jp30no$gbn$
Mostrar la cita
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.
Ads by Google
Search Busqueda sugerida