Page 1 of 1

Capturando una aplicación externa y fijando coordenadas

PostPosted: Tue May 29, 2018 8:35 am
by José Vicente Beltrán
Hola colegas,
mi problema es:
1.- Tengo que capturar un teclado virtual
2.- Ponerle un tamaño
3.- Fijarlo en unas coordenadas concretas.
Code: Select all  Expand view
WINEXEC( "tecladoV.exe" )
oWnd := TWCapture():New( "Teclado Virtual")
oWnd:SetSize( 900, 300 )
SetWindowPos( oWnd:hWnd, 0, 200, 100, 901, 301, 4 )
 

En los puntos 1 y 2 no hay problema, pero.... el 3 se me atraganta, he probado varias cosas y no funcionan.
Los parametros pasados en SetWndowsPos() estan sacados de windows.prg que acompaña a FiveWin.
Tambien leí sobre el concepto TRECT pero no logro saber como funciona.
¿Alguien podría darme luz?
Saludos :shock:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 9:21 am
by José Vicente Beltrán
:shock:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 11:35 am
by cnavarro
Jose Vicente, este ejemplo creo que funciona bien
Fijate en las dimensiones de la ventana que pones en el SetSize y las que pones en el WindowsPos, imagino que tendrán algo que ver

Code: Select all  Expand view


   WINEXEC( "notepad.exe" )
   oWnd := TWCapture():New( "Sin título: Bloc de notas")
   oWnd:SetSize( 700, 200 )
   SetWindowPos( oWnd:hWnd, 0, 10, 10, 711, 211, 4 )

 

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 1:27 pm
by José Vicente Beltrán
Cristobal, gracias por responder, pero con el ejemplo que propones la ventana capturada no respeta ni el tamaño ni las coordenadas y siempre aparece en el mismo sitio de la pantalla. Además de eso si el segundo parámetro de setwindowPos(oWnd:hWnd, 0, 10, 10, 711, 211, 4) es CERO, con el bloc de notas no ocurre pero el teclado virtual hace un flash y desaparece, solo permanece en pantalla si el parámetro en cuestión es 100 (no tengo idea de por qué) :shock:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 2:03 pm
by cnavarro
A mi ese ejemplo me respeta ambas funciones
En cuanto al significado del segundo parámetro:
https://msdn.microsoft.com/es-es/librar ... 45(v=vs.85).aspx

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 2:38 pm
by José Vicente Beltrán
Otra vez gracias Cristobal, con esos datos voy a profundizar sobre el tema. :shock:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 2:43 pm
by cnavarro
José Vicente Beltrán wrote:Cristobal, gracias por responder, pero con el ejemplo que propones la ventana capturada no respeta ni el tamaño ni las coordenadas y siempre aparece en el mismo sitio de la pantalla. :shock:


Jose Vicente eso me pasó a mí al principio pero era debido a que el título de la ventana no era el correcto

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 3:59 pm
by José Vicente Beltrán
Lo he pensado también, pero la ventana se captura y dimensiona correctamente, lo unico que no hace es respetar las coordenadas de posición, se situa aleatoriamente y ya no se mueve aunque le mandes coordenadas diferentes.
He mirado el link que me sugieres, y el segundo parametro tampoco lo respeta a no ser que sea 100 (que está totalmente fuera de rango, solo son validos 0, 1, 2, -1) :shock:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Thu May 31, 2018 6:14 pm
by hectorpapiri
José

Estuve probando el ejemplo de Navarro y funciona perfectamente (usando una vieja clase que tenia por ahi suelta, supongo que es la misma) tanto en windows 7 como en 10.
Es más, lo he modificado asi:
Code: Select all  Expand view

FUNCTION prueba
   local oWnd, nPos
   WINEXEC( "notepad.exe" )
   oWnd := TWCapture():New( "Sin título: Bloc de notas")
   oWnd:SetSize( 700, 200 )

   for nPos := 1 to 10
      SetWindowPos( oWnd:hWnd, 0, 10*nPos, 10*nPos, 711, 211, 4 )
      syswait(1)
   next

RETURN NIL

//----------------------------------------------------------------------------//

CLASS TWCapture FROM TWindow

    DATA lCaptured

    METHOD New( cTitle ) CONSTRUCTOR
    METHOD WCapture( cTitle )

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( cTitle ) CLASS TWCapture

    if( ValType( cTitle ) == "C", ::WCapture( cTitle ), ::lCaptured := .f. )

return( Self )

//----------------------------------------------------------------------------//

METHOD WCapture( cTitle ) CLASS TWCapture

   local hWnd := FindWindow( 0, cTitle )

   ::lCaptured := ( hWnd > 0 )
   ::hWnd := if( ::lCaptured, hWnd, 0 )

return( ::lCaptured )

//----------------------------------------------------------------------------//

 

Y se va moviendo de posición como debe ser.

Con respecto al segundo parametro, te paso una ayuda:
Identifica la ventana que precede a la ventana posicionada en el orden Z. Este parámetro debe ser un identificador de ventana o uno de los siguientes valores:
HWND_BOTTOM
Coloca la ventana en la parte inferior del orden Z. Si el parámetro hWnd identifica una ventana superior, la ventana pierde su estado más alto y se coloca en la parte inferior de todas las demás ventanas.
HWND_NOTOPMOST
Coloca la ventana sobre todas las ventanas que no están en la parte superior (es decir, detrás de todas las ventanas superiores). Esta bandera no tiene efecto si la ventana ya es una ventana no superior.
HWND_TOP
Coloca la ventana en la parte superior del orden Z.
HWND_TOPMOST
Coloca la ventana sobre todas las ventanas que no están en la parte superior. La ventana mantiene su posición más alta incluso cuando está desactivada

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Fri Jun 01, 2018 4:32 pm
by José Vicente Beltrán
Muchas gracias a ti también, Hector, la clase es la misma que yo estoy usando, lo curioso es que tanto tu ejemplo como el de Cristobal funcionan correctamente con el bloc de notas, pero cuando lo intento con un teclado virtual (FreeVK.exe) deja de funcionar (se situa donde quiere, aunque SI respeta el tamaño que le indico) :oops:

Debe ser cosa del tipo de archivo :roll:

Re: Capturando una aplicación externa y fijando coordenadas

PostPosted: Fri Jun 01, 2018 5:09 pm
by José Vicente Beltrán
Bueno pues gracias a Cristobal y a Hector debo decir que está SOLUCIONADO, era un problema de diseño de la rutina, atribuible TOTALMENTE a un servidor y a una variable que tomaba un valor incorrecto y que yo era incapaz de ver solo.

GRACIAS :shock: :shock: