Ir al contenido


Foto

Controlar otro programa desde tu aplicación


  • Por favor identifícate para responder
12 respuestas en este tema

#1 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 07 julio 2011 - 03:57

Hola.

¿ Alguien ha probado alguna vez a controlar otra aplicación desde la tuya ?.

Tengo un cliente que quiere recuperar datos de una aplicación antigua, y el fabricante se niega a pasarle las credenciales para abrir la base de datos.

He pensado que podría escribir un programa que controle esa aplicación, y se mueva por la lista de clientes, copiando la información. Es decir una vez en la pantalla de clientes, que vaya pulsando sucesivamente el botón Siguiente y el botón Editar, y en cada una de las pantallas de Clientes, ir leyendo los Labels donde está la información.

Más o menos como hace el TestComplete para testear tus aplicaciones.

Pero no tengo ni idea de como poder provocar la pulsación de botones o leer labels de otra aplicación en ejecución.

¿ Alguien lo ha hecho ?.

Gracias.

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 julio 2011 - 09:35

Para simular un click: Como simular un Click de ratón.

Para espiar el texto de las ventanas:

cpp
  1. SendMessage(hWndFix, WM_GETTEXT, sizeof(Buffer), (LPARAM)Buffer);

Encuentras el Handle de la ventana que espías con WindowFromPoint.

Puedes husmear en el código de WinInfo para sacar mas ideas.  ;)



Saludos.
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 07 julio 2011 - 12:03

Gracias.

Esta información me es muy útil para avanzar en el desarrollo de una aplicación de captación de datos en otras aplicaciones.

Pero necesito controlarlo más al detalle para lograr lo que quiero. Debería poder identificar los controles del formulario a controlar, para leer independientemente el texto en cada label (y no conjuntamente todo el texto del formulario). De la misma manera necesito poder identificar los botones de "Siguiente" y "Editar" en la aplicación controlada, para poder averiguar sus coordenadas globales y enviar pulsaciones de ratón a esas coordenadas.

Tu ayuda me ha dado un punto de partida (y me ha convencido de que es factible desarrollar esta aplicación).

Gracias.
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 07 julio 2011 - 01:05

Acabo de probar tu aplicación "InfoWin", y está muy cerca de darme todo lo que necesito.

Veo que los TEdit ya se pueden acceder por separado, para recoger su contenido. El único problema es identificarlos, puesto que en cada apertura del formulario, los Handles asociados a cada TEdit varían (y su Clase de Ventana es TEdit y no el nombre que le hayamos asignado en Delphi al control).

Seguro que hay alguna forma de recuperar el nombre asignado al control desde Delphi (o el lenguaje asociado), para poder identificarlos (puesto que en TestComplete, bien que lo hacen).

Veo que en los Edit ya puedes recuperar su posición. Ahora necesito identificar los botones, para recuperar también su posición para poder hacer clicks sobre ellos.

También me falta poder hacer un recorrido en las celdas de una Grid.

Pensé que hacer este programa de captación de datos controlando la aplicación original era uno de mis desvaríos, pero gracias a tu programa de información de ventanas, tengo claro de que debería poder hacerse bien.

Gracias.
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 julio 2011 - 03:28

Acabo de probar tu aplicación "InfoWin", y está muy cerca de darme todo lo que necesito...

...Pensé que hacer este programa de captación de datos controlando la aplicación original era uno de mis desvaríos, pero gracias a tu programa de información de ventanas, tengo claro de que debería poder hacerse bien.


No es un desvarío, se puede hacer...

Sólo tienes que identificar bien cada botón que quieres pulsar y cada ventana cuyo texto quieres copiar. Si el programa original no está escrito en delphi, los nombres de clase de cada ventana (teniendo en cuenta que en windows cada control es una ventana) variarán. Puedes realizar una especie de archivo.log donde guardes una ruta muestra de los botones y ventanas a leer para que luego la aplicación espía realice esos pasos...

En fin, tu conoces las aplicaciones y lo que te hace falta, el resto es probar y poner imaginación.  ;) (y) :D


Saludos.
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 08 julio 2011 - 01:30

...o guardarte las coordenadas (top, left) de cada componenete medidas en su form original y enviar mensajes al form para hacer click en cada sitio, luego lees el contenido del edit activo/focused (perdón, del "window" focused del form) y al final pinchas en las coordenadas del "OK".... no necesitarias nombre de objetos, solo sus coordenadas relativas al form, y eso es sencillo con solo capturar cada pantalla y medir.
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 08 julio 2011 - 01:37

Solo por curiosidad ¿que tipo de base de datos es?
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 08 julio 2011 - 01:55

Solo por curiosidad ¿que tipo de base de datos es?


Progress OpenEDGE. Un lenguaje/entorno de desarrollo, con base de datos propia incluida, basado en Java.

http://web.progress....evelopment.html

Tiene driver ODBC, pero mi cliente no sabe las contraseñas a utilizar, y ya hace años que se dio de baja de asistencia para ese programa. Les he pedido que pregunten las contraseñas, pero no se las quieren dar.
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 08 julio 2011 - 02:00

...o guardarte las coordenadas (top, left) de cada componenete medidas en su form original y enviar mensajes al form para hacer click en cada sitio, luego lees el contenido del edit activo/focused (perdón, del "window" focused del form) y al final pinchas en las coordenadas del "OK".... no necesitarias nombre de objetos, solo sus coordenadas relativas al form, y eso es sencillo con solo capturar cada pantalla y medir.


Tienes razón. :)

Lo que dices es más sencillo de lo que había previsto, hoy quería intentar escribir un módulo que me sacara un listado de controles dentro de una ventana. Pero tienes toda la razón, no hay ninguna necesidad.

Solo necesito guardarme las coordenadas relativas de los puntos donde hay texto que quiero recoger, y botones que quiero pulsar. Después paso esas coordenadas a coordenadas absolutas y ya puedo empezar el proceso de captación, sin necesidad de haber tenido que identificar los controles que se encuentran bajo esas coordenadas.

Muchas gracias.  (y)
  • 0

#10 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 08 julio 2011 - 03:47


...o guardarte las coordenadas (top, left) de cada componenete medidas en su form original y enviar mensajes al form para hacer click en cada sitio, luego lees el contenido del edit activo/focused (perdón, del "window" focused del form) y al final pinchas en las coordenadas del "OK".... no necesitarias nombre de objetos, solo sus coordenadas relativas al form, y eso es sencillo con solo capturar cada pantalla y medir.


Tienes razón. :)

Lo que dices es más sencillo de lo que había previsto, hoy quería intentar escribir un módulo que me sacara un listado de controles dentro de una ventana. Pero tienes toda la razón, no hay ninguna necesidad.

Solo necesito guardarme las coordenadas relativas de los puntos donde hay texto que quiero recoger, y botones que quiero pulsar. Después paso esas coordenadas a coordenadas absolutas y ya puedo empezar el proceso de captación, sin necesidad de haber tenido que identificar los controles que se encuentran bajo esas coordenadas.

Muchas gracias.  (y)


Asi es como lo hariamos los humanos si tubiesemos que hacerlo sin programacion: miras en ciertas posiciones, te copias el texto, pulsas el boton de abajo a la derecha, pasa a la siguiente ficha...

Otro sistema que usamos nosotros mucho para estos casos "dificiles": Instalas una impresora de tipo texto (al imprimir te genera un txt), la pones por defecto de windows, te vas a la aplicacion rebelde y le pides imprimir todos los clientes.... lees el texto como un CSV de longitud fija de campo y ALEHOP!
  • 0

#11 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 08 julio 2011 - 04:06

Asi es como lo hariamos los humanos si tubiesemos que hacerlo sin programacion: miras en ciertas posiciones, te copias el texto, pulsas el boton de abajo a la derecha, pasa a la siguiente ficha...


Sí, me estaba complicando la vida (es que nunca he preparado nada así).

Creo que ya tengo todo lo que necesito. El cliente va a hacer que su abogado presione a los autores del programa para que les den las contraseñas de la base de datos, así que voy a esperar unos días a ver si lo consiguen, en caso contrario me pongo manos a la obra  (recorrer las grids va a ser lo más laborioso, pero como los botones de la barra de desplazamiento siempre están en el mismo sitio, también se puede recorrer las grids iterando clicks sobre posiciones fijas de la pantalla).

NOTA: Cuando el traspaso termine, les vamos a denunciar. Me encontré con la sorpresa de que nos han plagiado todas las pantalla técnicas. Ni siquiera han intentado disimularlo, han puesto exactamente los mismos campos que nuestra aplicación, con la misma distribución, las mismas descripciones y ayudas, ... No creo que saquemos nada de ello, pero mi socio quiere denunciarles (ya nos había ocurrido antes, pero nunca tan descarado).

Otro sistema que usamos nosotros mucho para estos casos "dificiles": Instalas una impresora de tipo texto (al imprimir te genera un txt), la pones por defecto de windows, te vas a la aplicacion rebelde y le pides imprimir todos los clientes.... lees el texto como un CSV de longitud fija de campo y ALEHOP!


Esto es mucho más fácil de programar, pero el problema es que normalmente no se imprimen todos los datos del cliente, así que a veces no se puede utilizar (como esta, ya que tengo que recuperar unas graduaciones técnicas que solo aparecen en pantalla).
  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 08 julio 2011 - 04:57

recorrer las grids va a ser lo más laborioso, pero como los botones de la barra de desplazamiento siempre están en el mismo sitio, también se puede recorrer las grids iterando clicks sobre posiciones fijas de la pantalla


Y porque no envias pulsaciones de tecla a la derecha, lees el texto del windows actual (la casilla seleccionada), te vuelves a mover enviando otra tecla... etc. luego flecha abajo, incio de linea (o lo que funcione usando el teclado en la pantalla real) y ale, recorres todas las celdas pulsando teclas.
  • 0

#13 angelo2007

angelo2007

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 14 julio 2011 - 11:52

¿cual software les plagiaron. a ustedes ?

¿osea cual es el suyo y cual es el de ellos con el plagio ?


  • 0




IP.Board spam blocked by CleanTalk.