Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Simular clic izquierdo C++

Estas en el tema de Simular clic izquierdo C++ en el foro de C/C++ en Foros del Web. Buenas!, primero quiero aclarar que soy novato en c++, aclarado esto les paso a explicar lo que necesito saber. Estoy diseñando un programa el cual ...
  #1 (permalink)  
Antiguo 11/10/2015, 20:33
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Simular clic izquierdo C++

Buenas!, primero quiero aclarar que soy novato en c++, aclarado esto les paso a explicar lo que necesito saber.

Estoy diseñando un programa el cual genera coordenadas X e Y, lo que necesito es que el programa mueva el ratón a esas coordenadas y haga un clic izquierdo.
No me parece que sea tan difícil, pero hasta ahora todo lo que he encontrado no me ha funcionando! :C

Espero sus respuestas, desde ya muchas gracias!.

PD: Les dejo algo de info por si la necesitan:

Estoy utilizando Sublime Text 2 y Windows 10.
  #2 (permalink)  
Antiguo 12/10/2015, 00:42
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Simular clic izquierdo C++

Buenas,

Para colocar el raton el las coordenadas utiliza setCursorPos:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Deberias recibir un mensaje WM_MOUSEMOVE en cuanto este posicionado correctamente.
Entonces solo queda hacer el click basta con enviar el mensaje correspondiente(WM_LBUTTONDOWN):
https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 12/10/2015, 06:23
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Simular clic izquierdo C++

El problema que tiene lo que quieres hacer es que es muy dependiente de la plataforma ya que lo que te indican solo servirá para Windows porque usa sus apis.
Si solo quieres simular una pulsación y no te importa que no sea en c++ puedes usar Autoit que es muy potente y haces eso con una sola línea de codigo. Te pongo un video que te explica un poco:
https://www.google.es/url?sa=t&sourc...b-UOtUzATX5jow
Luego usas aut2exe y conviertes el script en un ejecutable.
  #4 (permalink)  
Antiguo 12/10/2015, 07:35
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Para colocar el raton el las coordenadas utiliza setCursorPos:
[url]https://msdn.microsoft.com/en-us/library/windows/desktop/ms648394(v=vs.85).aspx[/url]

Deberias recibir un mensaje WM_MOUSEMOVE en cuanto este posicionado correctamente.
Entonces solo queda hacer el click basta con enviar el mensaje correspondiente(WM_LBUTTONDOWN):
[url]https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms644950(v=vs.85).aspx[/url]

Un saludo
Gracias a los dos por contestar, Falken me podrías mostrar como quedaría en el código?

Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4. using namespace std;
  5. int main(){
  6.     float coordX[10] = {000,11,22,33,44,55,66,77,88,99};
  7.     float coordY[10] = {000,11,22,33,44,55,66,77,88,99};
  8.     int c1 = 0;
  9.     int c2 = 0;
  10.     int c3 = 0;
  11.     int c4 = 0;
  12.  
  13. while (!GetAsyncKeyState(65)){
  14.     Sleep(1);
  15.     while (c1 <= 10){
  16.         cout <<" Combinaciones= "<<c4<<" "<<c3<<" "<<c2<<" "<<c1<<"  Coordenadas= | C4X= "<<coordX[c4]<<" "<<"C4Y= "<<coordY[c4]<<" | "<<"C3X= "<<coordX[c3]<<" "<<"C3Y= "<<coordY[c3]<<" | "<<"C2X= "<<coordX[c2]<<" "<<"C2Y= "<<coordY[c2]<<" | "<<"C1X= "<<coordX[c1]<<" "<<"C1Y= "<<coordY[c1]<<" | "<<endl;
  17.         //SetCursorPos(coordX[c4],coordY[c4]);
  18.         //SetCursorPos(coordX[c3],coordY[c3]);
  19.         //SetCursorPos(coordX[c2],coordY[c2]);
  20.         //SetCursorPos(coordX[c1],coordY[c1]);
  21.         Sleep(100); // Delay entre cada combinacion
  22.         c1++;
  23.         if (c1 == 10){
  24.             c1 = 0;
  25.             c2++;
  26.         }
  27.             if (c2 == 10){
  28.                 c2 = 0;
  29.                 c3++;
  30.             }
  31.                 if (c3 == 10){
  32.                     c3 = 0;
  33.                     c4++;
  34.                 }
  35.                     if (c4 == 10){
  36.                         getch();
  37.                     }  
  38.  
  39.                        
  40. }
  41. }
  42. }

Esto es lo que tengo hasta ahora, me imprime en consola los 4 números de la combinación, y cada coordenada (que todavía no son las reales) de cada número.

Necesito que el ratón se mueva con SetCursorPos(coordX[c4],coordY[c4]); y luego de esto haga un clic izquierdo, luego se mueva SetCursorPos(coordX[c3],coordY[c3]); y vuelva a hacer otro clic, y así hasta que digite las 4 cifras

Desde ya muchas gracias!! :D
  #5 (permalink)  
Antiguo 12/10/2015, 07:38
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Para colocar el raton el las coordenadas utiliza setCursorPos:
[url]https://msdn.microsoft.com/en-us/library/windows/desktop/ms648394(v=vs.85).aspx[/url]

Deberias recibir un mensaje WM_MOUSEMOVE en cuanto este posicionado correctamente.
Entonces solo queda hacer el click basta con enviar el mensaje correspondiente(WM_LBUTTONDOWN):
[url]https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms644950(v=vs.85).aspx[/url]

Un saludo
Gracias a los dos por contestar, Falken me podrías mostrar como quedaría en el código?

Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4. using namespace std;
  5. int main(){
  6.     float coordX[10] = {00,11,22,33,44,55,66,77,88,99};
  7.     float coordY[10] = {00,11,22,33,44,55,66,77,88,99};
  8.     int c1 = 0;
  9.     int c2 = 0;
  10.     int c3 = 0;
  11.     int c4 = 0;
  12.  
  13. while (!GetAsyncKeyState(65)){
  14.     Sleep(1);
  15.     while (c1 <= 10){
  16.         cout <<" Combinaciones= "<<c4<<" "<<c3<<" "<<c2<<" "<<c1<<"  Coordenadas= | C4X= "<<coordX[c4]<<" "<<"C4Y= "<<coordY[c4]<<" | "<<"C3X= "<<coordX[c3]<<" "<<"C3Y= "<<coordY[c3]<<" | "<<"C2X= "<<coordX[c2]<<" "<<"C2Y= "<<coordY[c2]<<" | "<<"C1X= "<<coordX[c1]<<" "<<"C1Y= "<<coordY[c1]<<" | "<<endl;
  17.         //SetCursorPos(coordX[c4],coordY[c4]);
  18.         //SetCursorPos(coordX[c3],coordY[c3]);
  19.         //SetCursorPos(coordX[c2],coordY[c2]);
  20.         //SetCursorPos(coordX[c1],coordY[c1]);
  21.         Sleep(100); // Delay entre cada combinacion
  22.         c1++;
  23.         if (c1 == 10){
  24.             c1 = 0;
  25.             c2++;
  26.         }
  27.             if (c2 == 10){
  28.                 c2 = 0;
  29.                 c3++;
  30.             }
  31.                 if (c3 == 10){
  32.                     c3 = 0;
  33.                     c4++;
  34.                 }
  35.                     if (c4 == 10){
  36.                         getch();
  37.                     }  
  38.  
  39.                        
  40. }
  41. }
  42. }

Lo que aparece en el cmd:


Esto es lo que tengo hasta ahora, me imprime en consola los 4 números de la combinación, y cada coordenada (que todavía no son las reales) de cada número.

Necesito que el ratón se mueva con SetCursorPos(coordX[c4],coordY[c4]); y luego de esto haga un clic izquierdo, luego se mueva SetCursorPos(coordX[c3],coordY[c3]); y vuelva a hacer otro clic, y así hasta que digite las 4 cifras

Desde ya muchas gracias!! :D

Última edición por SantiiLB; 12/10/2015 a las 08:46
  #6 (permalink)  
Antiguo 13/10/2015, 07:45
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Exclamación Respuesta: Simular clic izquierdo C++

Alguien que me responda esto por favor!, simple, como hacer un clic izquierdo en C++ necesito el código y nada más!
  #7 (permalink)  
Antiguo 14/10/2015, 06:25
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por SantiiLB Ver Mensaje
Alguien que me responda esto por favor!, simple, como hacer un clic izquierdo en C++ necesito el código y nada más!
Código C++:
Ver original
  1. if (SetCursorPos ((int)Coord [x], (int)Coord [y]))
  2.    SendMessage (NULL, WM_LBUTTONDOWN, 0, 0);

Con eso haces clic izquierdo en las coordenadas indicadas. El primer parámetro es null porque es el escritorio pero si quieres que sea en una ventana tendrías que poner su han de el cual podrías obtener con FindWindow.
  #8 (permalink)  
Antiguo 14/10/2015, 14:23
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Sonrisa Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por aguml Ver Mensaje
Código C++:
Ver original
  1. if (SetCursorPos ((int)Coord [x], (int)Coord [y]))
  2.    SendMessage (NULL, WM_LBUTTONDOWN, 0, 0);

Con eso haces clic izquierdo en las coordenadas indicadas. El primer parámetro es null porque es el escritorio pero si quieres que sea en una ventana tendrías que poner su han de el cual podrías obtener con FindWindow.
Al fin alguien que responde con el código!

Mira, primero muchísimas gracias por tomarte la molestia de contestarme, acabo de colocar esas líneas en mi código y así quedo:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4. using namespace std;
  5. int main(){
  6.     float coordX[10] = {000,11,22,33,44,55,66,77,88,99};
  7.     float coordY[10] = {000,11,22,33,44,55,66,77,88,99};
  8.     int c1 = 0;
  9.     int c2 = 0;
  10.     int c3 = 0;
  11.     int c4 = 0;
  12.  
  13. while (!GetAsyncKeyState(65)){
  14.     Sleep(1);
  15.     while (c1 <= 10){
  16.         cout <<" Combinaciones= "<<c4<<" "<<c3<<" "<<c2<<" "<<c1<<"  Coordenadas= | C4X= "<<coordX[c4]<<" "<<"C4Y= "<<coordY[c4]<<" | "<<"C3X= "<<coordX[c3]<<" "<<"C3Y= "<<coordY[c3]<<" | "<<"C2X= "<<coordX[c2]<<" "<<"C2Y= "<<coordY[c2]<<" | "<<"C1X= "<<coordX[c1]<<" "<<"C1Y= "<<coordY[c1]<<" | "<<endl;
  17.         if (SetCursorPos ((int)Coord [coordX], (int)Coord [coordY]));
  18.             SendMessage (NULL, WM_LBUTTONDOWN, 0, 0);
  19.             Sleep(100); // Delay entre cada combinacion
  20.         c1++;
  21.         if (c1 == 10){
  22.             c1 = 0;
  23.             c2++;
  24.         }
  25.             if (c2 == 10){
  26.                 c2 = 0;
  27.                 c3++;
  28.             }
  29.                 if (c3 == 10){
  30.                     c3 = 0;
  31.                     c4++;
  32.                 }
  33.                     if (c4 == 10){
  34.                         getch();
  35.                     }  
  36.                        
  37. }      
  38. }
  39. }

Al compilar me dice lo siguiente:



Supongo que ya sabes, pero por las dudas... "9999" es el nombre del archivo xD.
Muchas gracias de nuevo por contestar, espero que tengas alguna respuesta a este error que apareció.

" 'Coord' was not declared in this scope "

Un saludo!.

Última edición por SantiiLB; 14/10/2015 a las 14:57
  #9 (permalink)  
Antiguo 15/10/2015, 01:57
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por SantiiLB Ver Mensaje
Al fin alguien que responde con el código!
Ese es el problema... que únicamente estabas buscando el código.

La programación es algo artesanal... cada problema suele requerir una solución más o menos espcífica. Si no fuese así hace ya tiempo que tendríamos un componente para cada cosa que necesitásemos hacer y nuestro trabajo sería únicamente ir ensamblando piezas ya hechas.

De lo que se trata es de que aprendas a leer la documentación de las APIS y a entender lo que te están diciendo... vamos aprender a buscarte la vida.

Con la información que te hemos dado y un poco de tu esfuerzo habrías sabido dar con la solución a tu problema... pero no, has tirado por la vía fácil que era esperar a que alguien te diese el código mascado.

El problema que tienes ahora es más de lo mismo... has puesto un código que no te has molestado en entender y a consecuencia de ello ahora no sabes interpretar los errores que te indica el compilador.

¿Hás probado a leer el mensaje? ¿Sábes lo que significa? ¿Sábes por qué te sale? Cuando seas capaz de responder afirmativamente a estas tres preguntas entonces deberías ser capaz de encontrar una solución al problema tu solo.

No se tú, pero yo cuando estaba aprendiendo tenía la esperanza de dedicarme a esto en el futuro... si no te molestas en entender lo que tienes entre manos ¿cómo esperas poder ganarte la vida con ello?

Nota final: pese a que ahora se venda la programación como si fuese algo banal, la programación no es fácil ni muchas veces agradable ni, por supuesto, barata (o te gastas bastante dinero en cursos que merezcan la pena o inviertes una gran cantidad de tiempo en dominar los recursos que tienes a tu alcance). Bien es cierto que con una cantidad relativamente corta de tiempo puedes dejar a un mono tirando líneas de código cual pollo sin cabeza, pero ya te garantizo yo que ese código no será legible ni reusable ni fácil de mantener ni estará libre de errores.

Luego no digas que no te avisamos.

Un saludo.
  #10 (permalink)  
Antiguo 15/10/2015, 02:13
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Simular clic izquierdo C++

El compilador te está dando el error mascadito. Yo puse Coord[x] y Coord[y] por poner algo y claro, no existen en tu código pero si ves lo que pusiste en tu anterior código ves esto:
SetCursorPos(coordX[c4],coordY[c4]);
¿Probaste a sustituir Coord[x] por coordX[c4] y Coord[y] por coordY[c4]?
Programar no es hacer copy/paste. Yo soy autodidacta y puedo tener muchos fallos y vicios pero ganas de probar cosas y aprender no me faltan.
  #11 (permalink)  
Antiguo 15/10/2015, 02:49
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Simular clic izquierdo C++

A mí en su momento me dio problemas con el siguiente código:
Código C++:
Ver original
  1. POINT pos_cursor;
  2. pos_cursor.x=650;
  3. pos_cursor.y=424;
  4.  
  5. if(SetCursorPos(pos_cursor.x,pos_cursor.y)){
  6.    SendMessage(NULL,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(pos_cursor.x,pos_cursor.y));
  7.    SendMessage(NULL,WM_LBUTTONUP,0,MAKELPARAM(pos_cursor.x,pos_cursor.y));
  8. }

El problema que me dio fue que SendMessage enviaba el mensaje pero intentaba pulsar un botón y esto no pasaba así que me busqué otra solución y fue esta:
Código C++:
Ver original
  1. POINT pos_cursor;
  2. pos_cursor.x=650;
  3. pos_cursor.y=424;
  4.  
  5. if(SetCursorPos(pos_cursor.x,pos_cursor.y)){
  6.    mouse_event(MOUSEEVENTF_LEFTDOWN,pos_cursor.x,pos_cursor.y,0,0);
  7.    mouse_event(MOUSEEVENTF_LEFTUP,pos_cursor.x,pos_cursor.y,0,0);
  8. }

Seguramente mouse_event internamente llame a SendMessage y si viesemos en un depurador con qué valores lo llama sabríamos en que fallaba.

Última edición por aguml; 15/10/2015 a las 06:13
  #12 (permalink)  
Antiguo 15/10/2015, 14:05
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
De acuerdo Respuesta: Simular clic izquierdo C++

Cita:
Iniciado por eferion Ver Mensaje
Ese es el problema... que únicamente estabas buscando el código.

La programación es algo artesanal... cada problema suele requerir una solución más o menos espcífica. Si no fuese así hace ya tiempo que tendríamos un componente para cada cosa que necesitásemos hacer y nuestro trabajo sería únicamente ir ensamblando piezas ya hechas.

De lo que se trata es de que aprendas a leer la documentación de las APIS y a entender lo que te están diciendo... vamos aprender a buscarte la vida.

Con la información que te hemos dado y un poco de tu esfuerzo habrías sabido dar con la solución a tu problema... pero no, has tirado por la vía fácil que era esperar a que alguien te diese el código mascado.

El problema que tienes ahora es más de lo mismo... has puesto un código que no te has molestado en entender y a consecuencia de ello ahora no sabes interpretar los errores que te indica el compilador.

¿Hás probado a leer el mensaje? ¿Sábes lo que significa? ¿Sábes por qué te sale? Cuando seas capaz de responder afirmativamente a estas tres preguntas entonces deberías ser capaz de encontrar una solución al problema tu solo.

No se tú, pero yo cuando estaba aprendiendo tenía la esperanza de dedicarme a esto en el futuro... si no te molestas en entender lo que tienes entre manos ¿cómo esperas poder ganarte la vida con ello?

Nota final: pese a que ahora se venda la programación como si fuese algo banal, la programación no es fácil ni muchas veces agradable ni, por supuesto, barata (o te gastas bastante dinero en cursos que merezcan la pena o inviertes una gran cantidad de tiempo en dominar los recursos que tienes a tu alcance). Bien es cierto que con una cantidad relativamente corta de tiempo puedes dejar a un mono tirando líneas de código cual pollo sin cabeza, pero ya te garantizo yo que ese código no será legible ni reusable ni fácil de mantener ni estará libre de errores.

Luego no digas que no te avisamos.

Un saludo.
Entiendo lo que dices, y tienes toda la razón, yo en este caso solo buscaba una o dos simples lineas de código, porque sabía que existían pero no en que orden escribirlas, como me respondió aguml.
Con unos amigos estábamos pensando en la idea de crear un juego, tenemos casi lista la historia y todo lo que tendría que pasar en el juego, mi "rol" con otro amigo más sería el de programador, la verdad me gusta la idea de poder pensar algo y plasmarlo en líneas de código y que funcione!, pero justo esta pregunta no es el caso, simplemente quería la linea sin más, quiero terminar este mini-proyecto que me propuse de una vez y poder comenzar a estudiar java y ver que tal

Muchas gracias por las respuestas y la buena onda, aunque los mensajes de eferion los lea en un tono de enojo se que lo hace por mi propio bien c:

Espero que nos volvamos a cruzar en el foro, un saludo!.
Voy a probar con todo esto hasta que salga y posteo como queda al final :)
  #13 (permalink)  
Antiguo 17/10/2015, 14:36
 
Fecha de Ingreso: octubre-2015
Ubicación: Uruguay
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Sonrisa Respuesta: Simular clic izquierdo C++

Al final utilice esto:
Código C++:
Ver original
  1. if(SetCursorPos(X[c4],Y[c4])){                                     
  2.         mouse_event(MOUSEEVENTF_LEFTDOWN,X[c4],Y[c4],0,0);             
  3.         mouse_event(MOUSEEVENTF_LEFTUP,X[c4],Y[c4],0,0);
  4.         }

Se remplaza "X[c4]" y "Y[c4]" Por las coordenadas que ustedes quieran mover el mouse, por ejemplo, en el caso que quisieran mover el mouse a las coordenadas

x= 200
y= 250

Les quedaría algo así:
Código C++:
Ver original
  1. if(SetCursorPos(200,250)){                                     
  2.         mouse_event(MOUSEEVENTF_LEFTDOWN,200,250,0,0);             
  3.         mouse_event(MOUSEEVENTF_LEFTUP,200,250,0,0);
  4.         }

Espero que a alguien que tenga el mismo problema que tenía, esto le sea de ayuda, gracias a todas las personas que participaron en este hilo!.

Un saludo!.

Etiquetas: c++, clic, simular
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:10.