Un problema con TWCapture()
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
Un problema con TWCapture()
Tengo el siguiente problema que no sé por dónde atacar:
Supongamos que tenemos una ventana abierta correspondiente a una aplicación que puede o no estar escrita con FWH. Por ejemplo, un Word, o un programa comercial de Contabilidad...
La clase TWCapture() me permite tomar cierto control sobre esa ventana: Redimensionarla, ocultarla, moverla...
Ahora bien, lo que me gustaría saber es cómo podría recoger una lista de todos los controles (objetos) que presenta esa ventana. Por ejemplo: {oBtn1, oBtn2, oGet1, oGet2, oGet3, oLbx1....}
La idea es que a partir de esa lista debiera ser posible leer, entre ortras cosas, las coordenadas y contenido de Botones o campos Get. Más o menos, así: ? oBtn2:nTop, oBtn2:nLeftd, oGet1:VarGet()...
He hecho algunas pruebas con GetData() pero sin éxito. Quizá GetObject() sirviera, pero en mi manual no vienen referencias sobre cómo utilizarlo.
¿Alguien podría echarme una mano con un ejemplo sencillo de cómo hacerlo?
Gracias
Rafael
Supongamos que tenemos una ventana abierta correspondiente a una aplicación que puede o no estar escrita con FWH. Por ejemplo, un Word, o un programa comercial de Contabilidad...
La clase TWCapture() me permite tomar cierto control sobre esa ventana: Redimensionarla, ocultarla, moverla...
Ahora bien, lo que me gustaría saber es cómo podría recoger una lista de todos los controles (objetos) que presenta esa ventana. Por ejemplo: {oBtn1, oBtn2, oGet1, oGet2, oGet3, oLbx1....}
La idea es que a partir de esa lista debiera ser posible leer, entre ortras cosas, las coordenadas y contenido de Botones o campos Get. Más o menos, así: ? oBtn2:nTop, oBtn2:nLeftd, oGet1:VarGet()...
He hecho algunas pruebas con GetData() pero sin éxito. Quizá GetObject() sirviera, pero en mi manual no vienen referencias sobre cómo utilizarlo.
¿Alguien podría echarme una mano con un ejemplo sencillo de cómo hacerlo?
Gracias
Rafael
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
inspeccionar
hola
tienes que utilizar funciones del API.
Una vez obtenido el hwnd existen funciones para:
obtener el texto GetWindowText
coordenadas Getcoors
clase Getclassname
Piensa que si la aplicacion no es la que estas ejecutando nopuedes llamar a las funciones que decias
Para sacar los controles tienes que utilizar GetWindow con el hwnd de la ventana en primer lugar y GW_CHILD
Lueqo con el hwnd del control que obtengas se lo pasas a GetWindow pero ahora con GW_NEXT o algo asi mira los parametros de GetWindow.
Un saludo
Paco
tienes que utilizar funciones del API.
Una vez obtenido el hwnd existen funciones para:
obtener el texto GetWindowText
coordenadas Getcoors
clase Getclassname
Piensa que si la aplicacion no es la que estas ejecutando nopuedes llamar a las funciones que decias
Para sacar los controles tienes que utilizar GetWindow con el hwnd de la ventana en primer lugar y GW_CHILD
Lueqo con el hwnd del control que obtengas se lo pasas a GetWindow pero ahora con GW_NEXT o algo asi mira los parametros de GetWindow.
Un saludo
Paco
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
Paco:
Sí; todo lo que dices es cierto y ya me funciona bien. Parte de mi código:
El problema es que una vez tengo oWnd, debería poder pedir sus controles:
? LEN(oWnd:aControls)
y eso me da un error. En otras palabras: ¿Cómo puedo leer el array aControls? Una vez lo tenga, supongo que a partir de ahí podré leer las coordenadas, tipo, etc de cada uno ¿no?
Gracias y saludos,
Rafael
Sí; todo lo que dices es cierto y ya me funciona bien. Parte de mi código:
Code: Select all
oWnd := TWCapture():New( "OtraApp" )
hWnd := oWnd:hWnd
oWnd:Say(40, 20, "Hola que tal???", CLR_YELLOW, CLR_RED,, .T., .F.)
? getClassName(oWnd:hWnd)
? LEN(oWnd:aControls)
y eso me da un error. En otras palabras: ¿Cómo puedo leer el array aControls? Una vez lo tenga, supongo que a partir de ahí podré leer las coordenadas, tipo, etc de cada uno ¿no?
Gracias y saludos,
Rafael
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
inspect
no puedes
los programas que tu dices no tienen esas propiedades tienes que hacerlo conel api
Si fueran programas tuyos podrias hacer que se comunicaran por ejemplo con SendMesage y HandleEvent
También puedes con WM_COPYDATA
dime por donde quieres ir
paco
los programas que tu dices no tienen esas propiedades tienes que hacerlo conel api
Si fueran programas tuyos podrias hacer que se comunicaran por ejemplo con SendMesage y HandleEvent
También puedes con WM_COPYDATA
dime por donde quieres ir
paco
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
Paco:
En resumen: Desde mi aplicación quiero leer el contenido de un Get en la ventana de otra aplicación.
Para ello, pretendo definir el Get que me interesa según sus coordenadas en la ventana de la otra aplicación. Si tengo todos los controles en oWnd:aControls... bastaría hacer un bucle así (código inventado, por supuesto):
For i := 1 TO LEN(aControles)
IF Coords(aControles == MisCoords de Referencia()
oGet := aControles
cMiValor := oGet:VarGet()
Exit
ENDIF
Next
Return cMiValor
Hasta ahora, con TWCapture() puedo contolar dimensiones, esconder la ventana, cambiar su título e incluso conocer las coordenadas del cursor dentro de esa ventana. Pero me falta poder leer sus controles. Alguna idea?
Rafael
En resumen: Desde mi aplicación quiero leer el contenido de un Get en la ventana de otra aplicación.
Para ello, pretendo definir el Get que me interesa según sus coordenadas en la ventana de la otra aplicación. Si tengo todos los controles en oWnd:aControls... bastaría hacer un bucle así (código inventado, por supuesto):
For i := 1 TO LEN(aControles)
IF Coords(aControles == MisCoords de Referencia()
oGet := aControles
cMiValor := oGet:VarGet()
Exit
ENDIF
Next
Return cMiValor
Hasta ahora, con TWCapture() puedo contolar dimensiones, esconder la ventana, cambiar su título e incluso conocer las coordenadas del cursor dentro de esa ventana. Pero me falta poder leer sus controles. Alguna idea?
Rafael
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
Inspect
Hola
Mira, tu puedes hacer lo que hace TWCapture
DEFINE WINDOW oWnd
luego con un hWnd que hayas obtenido con FindWindow haces:
oWnd:hWnd := hWnd
Esto no quiere decir que aControls de oWnd se rellene automáticamente con los controles que sean hijos de hWnd.
Si quieres obtener el contenido de un Get tienes que utilizar:
GetWindowText( hWnd )
Como te devuelve una cadena de texto luego lo conviertes al tipo que tu sepas que tiene que contener.
Para obtener todos los controles de una ventana tienes que hacer esto:
¿Capichi?
Una vez que tienes los controles en un array puedes preguntar por su classname y si sabes que siempre va a estar el Get en el mismo orden pues lo tienes fácil. Solo tienes que pillar su GetWindowText
Dime si necesitas mas cosas.
Paco
Mira, tu puedes hacer lo que hace TWCapture
DEFINE WINDOW oWnd
luego con un hWnd que hayas obtenido con FindWindow haces:
oWnd:hWnd := hWnd
Esto no quiere decir que aControls de oWnd se rellene automáticamente con los controles que sean hijos de hWnd.
Si quieres obtener el contenido de un Get tienes que utilizar:
GetWindowText( hWnd )
Como te devuelve una cadena de texto luego lo conviertes al tipo que tu sepas que tiene que contener.
Para obtener todos los controles de una ventana tienes que hacer esto:
Code: Select all
local aControls := {}
hCtrl := GetWindow( hWnd, GW_CHILD )
do while hCtrl != 0
hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
if hCtrl != 0
aadd( aControls, hCtrl )
endif
enddo
Una vez que tienes los controles en un array puedes preguntar por su classname y si sabes que siempre va a estar el Get en el mismo orden pues lo tienes fácil. Solo tienes que pillar su GetWindowText
Dime si necesitas mas cosas.
Paco
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
Paco:
Ho capito . Gracias. Funciona casi perfecto. Solamente me falta un detalle que quizás me puedas solucionar:
He hecho un bucle:
Con los botones funciona perfecto, o sea, me da el prompt del botón.
Si precargo un Get con un texto: VAR cGet := "Hola"...., también lo detecta bien.
Pero si precargo un Get con cGet := SPACE(20), aunque escriba algo en él me devuelve blanco. Como si faltase un Refresh() o algo así. Hay alguna forma de hacer que lea el texto que he escrito en el Get?
Muchísimas gracias
Rafael
Ho capito . Gracias. Funciona casi perfecto. Solamente me falta un detalle que quizás me puedas solucionar:
He hecho un bucle:
Code: Select all
while hCtrl != 0
hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
cClassName := Upper(GetClassName(hCtrl))
? cClassName, GetWindowText(hCtrl)
end
Si precargo un Get con un texto: VAR cGet := "Hola"...., también lo detecta bien.
Pero si precargo un Get con cGet := SPACE(20), aunque escriba algo en él me devuelve blanco. Como si faltase un Refresh() o algo así. Hay alguna forma de hacer que lea el texto que he escrito en el Get?
Muchísimas gracias
Rafael
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
Antonio:
No; no uso ningún timer. Para las pruebas estoy usando una simple ventana (creada con FWH) con tres botones y dos gets. Un get lo inicializo por programa a "Hola" y el otro, a blancos.
La aplicación que trata de leer esos gets captura perfectamente el "Hola" pero aunque escriba algo en el otro get, lo ignora y siempre devuelve blanco.
Este es el trozo de código que uso:
Alguna idea?
Rafael
No; no uso ningún timer. Para las pruebas estoy usando una simple ventana (creada con FWH) con tres botones y dos gets. Un get lo inicializo por programa a "Hola" y el otro, a blancos.
La aplicación que trata de leer esos gets captura perfectamente el "Hola" pero aunque escriba algo en el otro get, lo ignora y siempre devuelve blanco.
Este es el trozo de código que uso:
Code: Select all
hCtrl := GetWindow( hWnd, GW_CHILD )
WHILE hCtrl != 0
cClassName := Upper(GetClassName(hCtrl))
IF cClassName = "EDIT"
? GetWindowText(hCtrl)
ENDIF
hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
END
Rafael
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Rafael Clemente
- Posts: 365
- Joined: Sat Oct 08, 2005 7:59 pm
- Location: Barcelona, Spain