Abril 21, 2018, 07:22:31 am

Autor Tema: [C++] Grabar/Reproducir movimientos del Mouse  (Leído 1933 veces)

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

Desconectado pajaroloco12

  • CPQUE??
  • *
  • Mensajes: 1
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
[C++] Grabar/Reproducir movimientos del Mouse
« en: Marzo 15, 2014, 05:23:31 am »
Saludos, os dejo el pequeño programa que he estado haciendo estas ultimas semanas, Bajo licencia GPL.

No tiene interfaz gráfica por lo que se lanza directamente desde consola.

encabezado.h
Código: You are not allowed to view links. Register or Login
#ifndef encabezado_h
#define encabezado_h

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <Windows.h>
#include <time.h>
 
#endif

main.cpp
Código: You are not allowed to view links. Register or Login
#include "encabezado.h"
#include "Header.h"

using namespace std;


int main(int argc, char* argv[])
{


mouse raton;

cronometro tiempo;
tiempo.inicio();
Sleep(200);

//Comprueba que se ha introducido la ruta del archivo, si no se introduce, muestestra error por panatalla y se cierra
if(argv[2]==NULL){raton.numerror(2);}
raton.wurl(argv[2]);//Cargo la ruta del archivo en la Clase

//Comprueba que se ha introducido un argumento, si no se introduce, muestestra error por panatalla y se cierra
if(argv[1]==NULL){raton.numerror(1);}

//Leo los argumentos y dependiendo del seleccionado lanzo la funciond de reproducir o grabar
if(strcmp(argv[1],"-p")==0){ShowWindow(GetForegroundWindow(),SW_MINIMIZE);raton.play(argv[3]);}
else if(strcmp(argv[1],"-r")==0){ShowWindow(GetForegroundWindow(),SW_MINIMIZE);raton.grabar();}
else{raton.numerror(6);}
    tiempo.fin();


    return 0;

};

Header.h
Código: You are not allowed to view links. Register or Login
#define lecturaporload 1600


class mouse
{
private:
struct posiciones{int x, y, boton;double time;}carga[lecturaporload+20];
char* ruta_archivo;

int caracteresleidos,
fin,
cuentafin;


void prload();
int grabarboton();

public:
void grabar();
void play(char* retardo);
void load();
void wurl(char* ruta){ruta_archivo=ruta;};
int numerror(int nerror);
};


class cronometro
{
private:
clock_t time1, time2;
int hora,
segundo,
minuto,
milisegundo;
double time;

public:
void inicio(){time1=clock();}
void fin(){time2=clock();time=((time2-time1)/(float)CLOCKS_PER_SEC);};
double tiempo();
double tiempooptimizado(char * entrada, double tiempo);

};



#endif

mouse.cpp
Código: You are not allowed to view links. Register or Login
#include "Header.h"

#ifndef _mouse_cpp_
#define _mouse_cpp_



void mouse::grabar()
{
cronometro tiempo;
POINT pt;
FILE * reg;

reg=fopen(ruta_archivo,"w");
//Si me da ERROR al abrir el archivo, REIntento acceder al archivo
for(int i=0;reg == NULL && i<=5;i++)
{
Sleep(200);
reg=fopen(ruta_archivo,"w");
if(i==5 && reg == NULL)
{
perror ("Error opening file");
}
}


char frase[30];
int contador=0,
presion=2,
presionl=2,
escribe=0,
yante=0,xante=0,
escribeanterior; //presion 0 si no se a presionado antes 1 si se a pesionado antes
double tiempoanterior=0;

tiempo.inicio();
while (!GetAsyncKeyState(VK_ESCAPE))
{   
GetCursorPos(&pt);
//
//Detecta si se presiona los pulsores del raton
if(presion==2)
{
if ((GetKeyState(VK_LBUTTON) & 0x80) != 0)
{
presion=3;
escribe=1;
}
}else{
if ((GetKeyState(VK_LBUTTON) & 0x80) == 0)
{
presion=2;
escribe=2;
}
}
if(presionl==2)
{
if ((GetKeyState(VK_RBUTTON) & 0x80) != 0)
{
presionl=3;
escribe=3;
}
}else{
if ((GetKeyState(VK_RBUTTON) & 0x80) == 0)
{
presionl=2;
escribe=4;
}
}


if(pt.x!=xante||pt.y!=yante||escribeanterior!=escribe)
{
tiempo.fin();
sprintf(frase,":%d,%d-%f&%d;\n\0",pt.x,pt.y,((float)tiempo.tiempo()-tiempoanterior),escribe);
tiempoanterior=tiempo.tiempo();
escribe=0;
printf("%s",frase);
fputs(frase,reg);
Sleep(5);
contador++;
yante=pt.y;
xante=pt.x;
escribeanterior=escribe;
}
}
fclose(reg);

}

void mouse::prload()//Esta funcion Cuenta el numero de registros antes de comenzar la reproduccón
{
FILE * reg;
reg=fopen(ruta_archivo,"r");

//Si me da ERROR al acceder al archivo, Vuelvo a intentar abrirlo.
for(int i=0;reg == NULL && i<=5;i++)
{
Sleep(200);
reg=fopen(ruta_archivo,"r");
if(i==5 && reg == NULL)
{
perror ("Error opening file");
}
}

char caracter;
int bucle=0;

while (!feof(reg))
{
caracter =fgetc(reg);
if(caracter==':')
{
bucle++;
}
}

fclose(reg);
fin=bucle;
cuentafin=0;
printf("Registros a procesar:%i\n",bucle);
}

void mouse::load()
{

/*
///////////////////////////////////////////////////////////////////////////////////////////
||Lee el archivo que se haya especificado en la ruta y cada X registros, (definidos por ||
||lecturaporload), lee y carga en la estructura los registros. ||
||Es decir, leeo 200 registro y los cargo en memoria, despues de ejecutar ||
||los 200, vuelvo a leer los registros desde el punto donde me quede Lellendo. ||
///////////////////////////////////////////////////////////////////////////////////////////

*/
char caracter,
recogida[200];

int selector=0,// 1:[:]Inicio(X) 2:[,]Separacion(Y) 3:[-]Tiempo 4:[&]Presion de botones del raton 0:[;]fin (no graba)
bucle=0,
contador=0,
registros=0;


FILE * reg;
reg=fopen(ruta_archivo,"r");

//Si me da ERROR al acceder al archivo, Vuelvo a intentar abrirlo.
for(int i=0;reg == NULL && i<=5;i++)
{
Sleep(200);
reg=fopen(ruta_archivo,"r");
if(i==5 && reg == NULL)
{
perror ("Error opening file");
}
}


fseek(reg, caracteresleidos,SEEK_SET);//Pongo el puntero de lectura en el lugar donde me quede anteriormente


while (contador<=lecturaporload&&!feof(reg))//Bucle hasta que se haya leido x  registros o hasta que detecte el final del documento.
{
caracter=fgetc(reg);
caracteresleidos++;//Total de caracteres leidos

if(caracter==';'){registros++;}

if(caracter==':')//Si detecto ":" identifica que el numero siguiente corresponde a la posicion X
{
selector=1;//X
bucle=0;
cuentafin++;//Total de registros leidos
}else if(caracter==',')//Si detecto "," el siguiente numero corresponde a la posición Y
{
if(selector==1)//Compruebo que el anterior simbolo fuese : y guardo los numeros en x
{
char *puntero=recogida;
carga[contador].x=atoi(puntero);//Con atoi Convierto los numeros de Char a INT
}
selector=2;//Y
bucle=0;
}else if(caracter=='-')//Si detecto "-" el siguiente numero corresponde a la posición tiempo flotante
{
if(selector==2)//Compruebo que el anterior simbolo fuese , y guardo los numeros en y
{
char *puntero=recogida;
carga[contador].y=atoi(puntero);//Con atoi Convierto de Char a INT
contador++;
}
selector=3;//Tiempo
bucle=0;
}else if(caracter=='&')//El siguienes numero corresponde a los botones de presion, grabo los valores anteriores: Tiempo
{
if(selector==3)//Compruebo que el anterior simbolo fuese - y guardo los numeros en time
{
char *puntero=recogida;
carga[contador].time=atof(puntero);//Con atof Convierto los numeros de Char a INT
}
selector=4;//Presion Boton
bucle=0;
}else if(caracter==';')//Fin del registro, Grabo los valores anteriores: Botones
{
if(selector==4)//1 Ldown 2 Lup 3Rdown 4 Rup
{
char *puntero=recogida;
carga[contador].boton=atoi(puntero);//Con atoi Convierto los numeros de Char a INT
}
selector=0;
bucle=0;
}else if(selector!=0)//Si el valor es un numero, lo almaceno para luego guardarlo donde proceda.
{
recogida[bucle]=caracter;
bucle++;
recogida[bucle]='\0';
}



}


//printf("Carga completada\n");
fclose(reg);
};

void mouse::play(char* retardo)
{
int contador=0,contadorregistros=0;

cronometro tiempo;
caracteresleidos=0;
prload();//Lee el arcchivo para comprobar el numero de registros total a leer
load(); //Lee el archivo y carga los registros en memoria
tiempo.inicio();

while (!GetAsyncKeyState(VK_ESCAPE)&&fin>=contadorregistros)//Bucle hasta que leea todos los registros.
{   

SetCursorPos(carga[contador].x, carga[contador].y);//Mueve el cursor a la posición que lee.
tiempo.fin();//Paro el cronometro

if(tiempo.tiempo()>=tiempo.tiempooptimizado(retardo,carga[contador].time))
{
//printf("%f  =>",tiempo.tiempo());printf("%f",tiempo.tiempooptimizado(retardo,carga[contador].time));printf(" = %f\n",carga[contador].time);

switch (carga[contador].boton)
{
case 1:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
break;
case 2:
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
break;
case 3:
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
break;
case 4:
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
break;
}

if(contador==lecturaporload)
{

load();//Cada X Cargo los siguientes registros en memoria
contador=0;
}
contador++;
contadorregistros++;
tiempo.inicio();//Inicio el cronometro

}

}
}


int mouse::numerror(int nerror)//Función para facilitar la impresión de los errores por pantalla
{


switch (nerror)
{
case 1:printf("ERROR  No se ha introducido ningun argumento\n");break;
case 2:printf("ERROR  No se ha introducido la ruta del archvio\n");break;
case 3:printf("ERROR  por razones desconocidas se ha producido un error al intentar abrir el archivo\n");break;
case 4:printf("ERROR  El archivo introducido no existe. Por favor revise la ruta\n");break;
case 5:printf("\n");break;
}

printf("\n\n\nUtilizacion:\n mouse [Argumentos] [Rutar Archivo]\n Argumentos:\n -p :Reproduce un archivo\n -p +/-0 :Velocidad de reproduccion en porcentaje -[Acelerar] o +[Realentizar] \n -r :Graba un archivo\n  ");exit(-1);
}


#endif

cronometro.cpp
Código: You are not allowed to view links. Register or Login
#include "Header.h"

#ifndef cronometro_cpp
#define cronometro_cpp

double cronometro::tiempo()
{
return time;
}

double cronometro::tiempooptimizado(char * entrada, double tiempo)
{
int intro;
char numero[10],calcular[10];
double porcentaje,total;

if(entrada == NULL)
{
return tiempo;
}

strcpy(numero,entrada);


for(int i=0; numero[i+1]!= NULL; i++)
{
calcular[i]=numero[i+1];
calcular[i+1]='\0';
}



char* calculo=calcular;
intro=atoi(calcular);

porcentaje=tiempo*intro/100;

//printf("entrada:%s, numero[0]:%c, calcular:%s",entrada,numero[0],calcular);
//printf("calcular:%s, intro:%i, porcentaje:%f\n",calcular,intro,porcentaje);

if(numero[0]=='+')
{
total=porcentaje+tiempo;
return total;
}else if(numero[0]=='-')
{
total=tiempo-porcentaje;
return total;
} else {
return tiempo;
}

}



#endif



Os invito a que lo mejoréis
Saludos.

Desconectado nmnmk

  • Me das tu IP?
  • *
  • Mensajes: 2
    • Ver Perfil
Re:[C++] Grabar/Reproducir movimientos del Mouse
« Respuesta #1 en: Mayo 09, 2015, 09:38:40 am »
 Muy bueno tu código amigo, lo compile y anda perfecto no me tiro ningún error, quería darte gracias por compartir esto ya que me ayudo a aprender mucho, además tu estilo de programación me parece bastante limpio y ordenado como tiene que ser.
 Lo estuve leyendo y me parece que el archivo que genera es bastante redundante, se podría optimizar designando el espacio justo para cada dato, eliminando las ',' los ':' y los 0D0Ah si algún día lo hago prometo que lo subo aquí mismo

Desconectado nmnmk

  • Me das tu IP?
  • *
  • Mensajes: 2
    • Ver Perfil
Re:[C++] Grabar/Reproducir movimientos del Mouse
« Respuesta #2 en: Mayo 16, 2015, 06:13:33 pm »
Esta modificación hace que los archivos generados sean 2.4 veces mas chicos  ;)

mouse.cpp
Código: You are not allowed to view links. Register or Login
#include "Header.h"

#ifndef _mouse_cpp_
#define _mouse_cpp_


void mouse::grabar()
{
cronometro tiempo;
POINT pt;
FILE * reg;
char *g;

reg=fopen(ruta_archivo,"wb");
//Si me da ERROR al abrir el archivo, REIntento acceder al archivo
for(int i=0;reg == NULL && i<=5;i++){

Sleep(200);
reg=fopen(ruta_archivo,"w");
if(i==5 && reg == NULL)
{
perror ("Error opening file");
}
}


//har frase[30];
struct temporal{
short x;   //2
short y;   //2
float tiempo; //4
char estado;  //1
}*frase;
frase=(temporal*)malloc(9);

int contador=0,
presion=2,
presionl=2,
escribe=0,
yante=0,xante=0,
escribeanterior; //presion 0 si no se a presionado antes 1 si se a pesionado antes
double tiempoanterior=0;

tiempo.inicio();
while (!GetAsyncKeyState(VK_ESCAPE))
{   
GetCursorPos(&pt);
//
//Detecta si se presiona los pulsores del raton
if(presion==2)
{
if ((GetKeyState(VK_LBUTTON) & 0x80) != 0)
{
presion=3;
escribe=1;
}
}else{
if ((GetKeyState(VK_LBUTTON) & 0x80) == 0)
{
presion=2;
escribe=2;
}
}
if(presionl==2)
{
if ((GetKeyState(VK_RBUTTON) & 0x80) != 0)
{
presionl=3;
escribe=3;
}
}else{
if ((GetKeyState(VK_RBUTTON) & 0x80) == 0)
{
presionl=2;
escribe=4;
}
}


if(pt.x!=xante||pt.y!=yante||escribeanterior!=escribe)
{
tiempo.fin();
printf(":%d,%d-%f&%d;\n\0",pt.x,pt.y,((float)tiempo.tiempo()-tiempoanterior),escribe);
frase->x=pt.x;
frase->y=pt.y;
frase->tiempo=(float)tiempo.tiempo()-tiempoanterior;
frase->estado=escribe;
tiempoanterior=tiempo.tiempo();
escribe=0;
for(int i=0;i<9;i++){
g=(char*)frase+i;
fputc(*g,reg);
}
Sleep(5);
contador++;
yante=pt.y;
xante=pt.x;
escribeanterior=escribe;
}
}
fclose(reg);

}

void mouse::prload(){//Esta funcion Cuenta el numero de registros antes de comenzar la reproduccón
FILE * reg;
reg=fopen(ruta_archivo,"r");

//Si me da ERROR al acceder al archivo, Vuelvo a intentar abrirlo.
for(int i=0;reg == NULL && i<=5;i++){
Sleep(200);
reg=fopen(ruta_archivo,"r");
if(i==5 && reg == NULL){
perror ("Error opening file");
}
}

char caracter;
int bucle=0;

fseek(reg, 0, SEEK_END); // Colocar el cursor al final del fichero
bucle = ftell(reg);

fclose(reg);
fin=bucle/9-1;
cuentafin=0;
printf("Registros a procesar:%i\n",fin);
}

void mouse::load(){

/*
///////////////////////////////////////////////////////////////////////////////////////////
||Lee el archivo que se haya especificado en la ruta y cada X registros, (definidos por ||
||lecturaporload), lee y carga en la estructura los registros. ||
||Es decir, leeo 200 registro y los cargo en memoria, despues de ejecutar ||
||los 200, vuelvo a leer los registros desde el punto donde me quede Lellendo. ||
///////////////////////////////////////////////////////////////////////////////////////////

*/
char caracter,
recogida[200],
modulo[9];

int selector=0,// 1:[:]Inicio(X) 2:[,]Separacion(Y) 3:[-]Tiempo 4:[&]Presion de botones del raton 0:[;]fin (no graba)
bucle=0,
contador=0,
registros=0;
short *p;
float *f;


FILE * reg;
reg=fopen(ruta_archivo,"rb");

//Si me da ERROR al acceder al archivo, Vuelvo a intentar abrirlo.
for(int i=0;reg == NULL && i<=5;i++)
{
Sleep(200);
reg=fopen(ruta_archivo,"r");
if(i==5 && reg == NULL)
{
perror ("Error opening file");
}
}


fseek(reg, caracteresleidos,SEEK_SET);//Pongo el puntero de lectura en el lugar donde me quede anteriormente


while ((contador<=lecturaporload)&&(caracteresleidos<fin*9))//Bucle hasta que se haya leido x  registros o hasta que detecte el final del documento.
{
for(int i=0;i<9;i++){
modulo[i]=fgetc(reg); //leo el registro
caracteresleidos++;//Total de caracteres leidos
}
p=(short*)modulo;
carga[contador].x= *p;
p=(short*)(modulo+2);
carga[contador].y= *p;
f=(float*)(modulo+4);
carga[contador].time= *f;


carga[contador].boton=(int) *(modulo+8);
contador++;

/*
if(caracter==';'){registros++;}

if(caracter==':')//Si detecto ":" identifica que el numero siguiente corresponde a la posicion X
{
selector=1;//X
bucle=0;
cuentafin++;//Total de registros leidos
}else if(caracter==',')//Si detecto "," el siguiente numero corresponde a la posición Y
{
if(selector==1)//Compruebo que el anterior simbolo fuese : y guardo los numeros en x
{
char *puntero=recogida;
carga[contador].x=atoi(puntero);//Con atoi Convierto los numeros de Char a INT
}
selector=2;//Y
bucle=0;
}else if(caracter=='-')//Si detecto "-" el siguiente numero corresponde a la posición tiempo flotante
{
if(selector==2)//Compruebo que el anterior simbolo fuese , y guardo los numeros en y
{
char *puntero=recogida;
carga[contador].y=atoi(puntero);//Con atoi Convierto de Char a INT
contador++;
}
selector=3;//Tiempo
bucle=0;
}else if(caracter=='&')//El siguienes numero corresponde a los botones de presion, grabo los valores anteriores: Tiempo
{
if(selector==3)//Compruebo que el anterior simbolo fuese - y guardo los numeros en time
{
char *puntero=recogida;
carga[contador].time=atof(puntero);//Con atof Convierto los numeros de Char a INT
}
selector=4;//Presion Boton
bucle=0;
}else if(caracter==';')//Fin del registro, Grabo los valores anteriores: Botones
{
if(selector==4)//1 Ldown 2 Lup 3Rdown 4 Rup
{
char *puntero=recogida;
carga[contador].boton=atoi(puntero);//Con atoi Convierto los numeros de Char a INT
}
selector=0;
bucle=0;
}else if(selector!=0)//Si el valor es un numero, lo almaceno para luego guardarlo donde proceda.
{
recogida[bucle]=caracter;
bucle++;
recogida[bucle]='\0';
}
*/


}


//printf("Carga completada\n");
fclose(reg);
};

void mouse::play(char* retardo)
{
int contador=0,contadorregistros=0;

cronometro tiempo;
caracteresleidos=0;
prload();//Lee el arcchivo para comprobar el numero de registros total a leer
load(); //Lee el archivo y carga los registros en memoria
tiempo.inicio();

while (!GetAsyncKeyState(VK_ESCAPE)&&fin>=contadorregistros)//Bucle hasta que leea todos los registros.
{   

SetCursorPos(carga[contador].x, carga[contador].y);//Mueve el cursor a la posición que lee.

tiempo.fin();//Paro el cronometro

if(tiempo.tiempo()>= carga[contador].time){

switch (carga[contador].boton)
{
case 1:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
break;
case 2:
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
break;
case 3:
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
break;
case 4:
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
break;
}

if(contador==lecturaporload){
load();//Cada X Cargo los siguientes registros en memoria
contador=0;
}
contador++;
contadorregistros++;
tiempo.inicio();//Inicio el cronometro

}

}
}

#endif
« Última modificación: Mayo 16, 2015, 06:21:17 pm por nmnmk »


exclamation
Detectar cuando el mouse esta sobre algo ( MouseOver - Mouse Leave) en C++

Iniciado por SEKTOR

0 Respuestas
2096 Vistas
Último mensaje Junio 01, 2010, 06:30:12 pm
por SEKTOR
exclamation
Registra los movimientos del ratón[En gráfico]

Iniciado por JACKlove

10 Respuestas
2660 Vistas
Último mensaje Diciembre 12, 2010, 02:47:13 pm
por mr.blood
xx
Ayuda con programa con limite de movimientos

Iniciado por fmartinezy

4 Respuestas
1089 Vistas
Último mensaje Octubre 01, 2014, 05:01:03 pm
por fmartinezy
xx
Como puedo saber los movimientos de un pc??? a que hora se inicia etc..

Iniciado por unitle_25

1 Respuestas
2611 Vistas
Último mensaje ſeptiembre 12, 2007, 03:58:14 am
por The X-C3LL
exclamation
Move Mouse (Mover Mouse con teclado.)

Iniciado por GilgamesHCo

2 Respuestas
1330 Vistas
Último mensaje Abril 26, 2010, 09:04:39 pm
por Final_Oscuro
xx
Qué miran los usuarios cuando ven una Web? Trabajo sobre movimientos oculares

Iniciado por shevchenko

0 Respuestas
1204 Vistas
Último mensaje Junio 24, 2008, 01:49:10 pm
por shevchenko
exclamation
Script "Mouse" Perl (mover/clickear mouse)

Iniciado por DarKreW

2 Respuestas
1828 Vistas
Último mensaje ſeptiembre 07, 2010, 11:20:48 am
por DarKreW
xx
REPRODUCIR MP3 EN RED HAT

Iniciado por ileyan

1 Respuestas
1088 Vistas
Último mensaje Junio 13, 2007, 08:09:55 pm
por fco_plj
question
Reproducir .wav con PlaySound()

Iniciado por myguestp

4 Respuestas
4955 Vistas
Último mensaje Mayo 09, 2010, 01:45:26 am
por SEKTOR
resuelto
[C][VBScript] Reproducir archivos Mp3, Wav, Mid

Iniciado por EddyW

4 Respuestas
4549 Vistas
Último mensaje Noviembre 10, 2009, 05:20:49 pm
por JaAViEr