FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Leer strings de otra aplicacion
Hola foreros, me gustaria poder leer las lineas escritas (y poder escribir) de un campo, creo que es richtext de otra aplicacion.
El motivo es que dicha aplicacion guarda los datos en formato binario y me parece que va a ser dificil interpretar esa informacion. Y parece ser que tienen una aplicacion (que solo funciona en win95) que ya hace eso que ahora me piden a mi (para modernizarlo, jejeje) Hasta ahora lo que he conseguido es: 1) Localizo las aplicaciones en ejecucion.
2) Localizo las ventanas de cada aplicacion.
3) Localizar los controles de cada ventana, aqui es donde necesito ayuda Para obtener los controles de nuestra aplicacion uso
¿Como podria obtener los controles de cada ventana? he buscado por todas parte y no encuentro la funcion, y se que deberia existir. El cuarto paso seria crear una thread que vigile dicho control y cuando entren nuevas lineas, las capturo e interpreto. El quinto paso serie escribir en ese mismo control ciertas lineas que son necesarias. Alguna ayudita, please. |
#2
|
||||
|
||||
cesarsoftware,
Revisa este link: Cita:
Nelson. |
#3
|
||||
|
||||
Hola sesarsoftware.
Otra opción, agrega un Edit, un ComboBox, tres Buttons dentro de un Panel, debajo un RichEdit y proba este ejemplo:
Si no sabes que clases puede contener la aplicación, quizá te interese comprobar en la función CallbackFn si el control es un Edit Control Logicamente es fundamental escribir en el edit textualmente el título de la ventana cuyo handle queremos obtener. También habrá controles de los cuales no podamos recibir o enviar texto alguno. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
||||
|
||||
Primero Gracias por ayudar.
Ya lo revise, pero ese ejemplo es para cuando se programan las dos aplicaciones, en mi caso una de ellas ya existe (es un CAD) y vaya usted a saber en que lenguaje esta hecha. |
#5
|
||||
|
||||
Gracias ecfisa, tiene buena pinta, ahora me pongo a probar esta tecnica.
Un saludo. |
#6
|
||||
|
||||
Hola ecfisa.
Muy bien para localizar los controles, estaria bien obtener sus nombres ademas del THandle. Pero...no me va el leer texto con TfrBusca.btnAppToREClick(Sender: TObject);
R siempre devuelve 0 (cero) y se queda en el repeat; tambien pasa en la funcion TfrBusca.btnREToAppClick(Sender: TObject); Lo he hecho de otra forma (mas simple) y me mete en un listbox, la aplicacion(proceso), sus formularios y sus respectivos controles Añadir un listbox y un richedit
y apara usarlo
Teniendo el handle del control ¿Como podemos obtener su clase, Tedit, Tcombox, etc, si no me funciona GetClassName? Uso Delphi 2010 y windows 7 64. ¿Se te ocurre algo? Gracias Edito: Lo mejor seria obtener el objeto ¿Se puede? asi seria mas facil, se podria usar richedit1.text := Trichedit(TObject).Text Última edición por cesarsoftware fecha: 11-12-2012 a las 12:27:51. |
#7
|
||||
|
||||
Hola cesarsoftware.
Cita:
Cita:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#8
|
||||
|
||||
Ooohhhh
He descargado y ejecutado tu aplicacion y ocurre lo mismo, R devuelve 0,eniff!! ¿Como va lo de obtener el objeto? |
#9
|
||||
|
||||
Cita:
Pero hay un pequeño problema, no precisamente los nombres obtenidos se enmarcarán dentro de las definiciones de Delphi (Tedit, Tcombox, TMemo, etc) es por eso que te comenté lo de verificar si era un Edit Control. Por ejemplo al obtener desde Mozilla Firefox (situado en este hilo), se tienen las clases MozillaWindowClass, GeckoPluginWindows y GeckoFPSandBoxChildWindow sobre las cuales yo . Con el Bloc de notas Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#10
|
||||
|
||||
Gracias por seguir el tema.
La funcion SendMessage(handle, WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer)); No me rellena el buffer con el "texto" que tenga el control. (visto que si es un Tedit como el de notepad, entonces devuelve su texto, genial.) pero si uso SendMessage(handle, WM_SETFOCUS, SizeOf(Buffer), Integer(@Buffer)); (ya, ya se que aqui el buffer pinta poco, no se donde buscar los parametros para WM_SETFOCUS) Da el foco perfectamente a cada control Creo que sera un tema de delphi 2010 mas que de S.O., tengo que probar tu aplicacion en un xp |
#11
|
||||
|
||||
Un momento.....
Esto si funciona, con TBitBtn, con Edit, con ComboBox, con StatusBar...
Pregunto, ¿Seguro que estan bien los parametros WParam y LParam para la funcion SendMessage con GETTEXT? Porque entiendo que guindos coge un area de memoria sabiendo en LParam Integer(@Buffer) y su tamaño en WParam SizeOf(buffer) SendMessage(handle, WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer)); Voy a probar con PostMessage |
#12
|
||||
|
||||
Nada, con postmessage, tampoco.
Que poquito falta.... |
#13
|
||||
|
||||
cesarsoftware,
Cita:
Nota: La aplicación la compile con Delphi 7 antes de probarla. Espero sea útil Nelson. Última edición por nlsgarcia fecha: 11-12-2012 a las 20:15:47. |
#14
|
||||
|
||||
Solucionado
SOLUCIONADO.
Como no el problema lo tenia Delphi 2010, vamos digo yo, porque a mi no me funciona el codigo de eficsa, recordar que GetClassName me devuelve 0. ¿Usais Delphi 2010? Es necesario y obligatorio preguntar cuanto va a ocupar el texto a leer y pedir que lea justo ese tamaño
Espero que os sirva. Gracias a todos PD: podemos seguir hasta obtener el objeto y asi hacer con el lo que nos plazca ¿no? |
#15
|
||||
|
||||
Cita:
Primeramente me alegro de que hayas encontrado la solución al tamaño (lo tendré en cuenta cuando pueda usar otra versión de delphi). Pero no entiendo por que estas obteniendo el handle del objeto a partir del texto del item del ComboBox/ListBox. El handle de cada objeto fué previamente guardado en el componente; entonces basta con:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#16
|
||||
|
||||
Hola ecfisa,
Lo hago porque como pinto el handle dentro del listbox (para ver el handle y la clase), asi me ahorro (de momento) tener el objeto dentro del listbox, sin mas.
Lo que necesito ahora es distinguir cada objeto (ademas de por el handle), quiero decir que si tenemos dos TEdit ¿Cual de ellos es el que queremos usar? Tendiendo el handle del objeto deberiamos porder obtener esa informacion ¿no? Pero no encuentro la funcion "GetObjectName". ¿Sabes cual es? Un saludo. |
#17
|
||||
|
||||
Hola.
Es que eso he tratado de decirte cuando sugería comprobar si era un "Edit Control" (About Edit Control), por que según creo no es posible a partir de un identificador de ventana (HWND) externo a tu aplicación, obtener el nombre de una instancia VCL. Es decir, operando con el HWND podes obtener o cambiar, ventanas, texto, colores, tamaño, ubicación , etc, pero mediante llamas API. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#18
|
||||
|
||||
Claro, es logico que no se compilen los nombres VCL, ¡es que lo queremos todo, jejeje!
En la aplicación que quiero capturar solo "se ve" un richedit (espero que sea eso o un memo, pero se le ven colores y formato, todavia no he pasado por el cliente para comprobarlo, ya que al ser un CAD y llevar mochila no puedo instalarlo en un pc mio), por lo que entiendo que no tendre problemas, pero para hacer un software "automático" deberiamos poder distinguirlo, supongo que se puede hacer por posicion, tamaño o algo, asi. Si tengo novedades lo publico. Thanks. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Leer parámetros que manda otra aplicación | NPIdea | API de Windows | 2 | 14-09-2010 11:20:22 |
leer y escribir en archivos .txt o cualquier otra extension | jafi666 | Varios | 1 | 13-03-2008 23:14:19 |
Leer texto de otra aplicación | erika.martinez | API de Windows | 17 | 04-05-2007 00:45:15 |
leer cadena de otra aplicacion | jar | OOP | 2 | 05-02-2007 20:18:12 |
|