Visual Basic para Aplicaciones - Lectura de un sector de pantalla de otra aplicacion...

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 11
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Coquito (79 intervenciones) el 25/07/2011 02:59:22
Un saludo... y gracias por responder...
En Excel... deseo procesar un sector rectangular (u otro) de la pantalla de otra aplicacion... comparando o procesando trasladar como valor a una celda... por favor... experiencias o ideas...
de nuevo... gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Ing Zeus Alberto Paez Renteria (26 intervenciones) el 25/07/2011 08:30:34
Porque no pruebas con el comando SendKeys(Keys, Wait) te puede enviar texto a la pantalla, yo lo utilizo desde excel enviando datos a una pantalla de otro programa llamado Cutworks de Gerber Technology, probablemente tendras que utilizar comandos como GetWindows utilizando en handle de la aplicacion, y si es una subventana deberas usar el EnumChildWindows, y probablemente utilices SetForegroundWindow que esa para mover el foco a una pantalla, que no es tu excel. Para buscarla puedes utilizar FindWindow, por ejemplo si tienes el Handle del Child puedes utilizar el GetParent para saber la ventana principal de donde viene bueno es lo que mas o menos lo que recuerdo, pero con estas funciones aunque complejas de usar, te tendras que echar un clavado a la programacion y podras hacer cosas que nunca te imaginaste con el VBA.

Quiza ni siquiera conozcas que es el handle de la aplicacion, bueno digamos que es un numero con el cual windows identifica a todas y cada una de las ventanas que maneja el sistema operativo y cada una tiene un handle (numero) unico que la identifica. Practicamente todas las funciones que te mencione funcionan con el Handle. Basicamente lo que estaras haciendo es utilizar funciones de Windows y no tanto de VBA.

Y para que hagas brincar al excel al proximo nivel estudia cada una de las siguientes funciones que se muestran en la siguiente pagina y podras hacer practicamente lo que quieras o lo que andas buscando, aunque no se que es exactamente, pero seguro aqui encontraras varias ideas de como lograrlo.

http://msdn.microsoft.com/en-us/library/ms632595(v=VS.85).aspx

Saludos y espero te sirva

Att. Ing. Zeus Alberto Paez Renteria
IT Engineer Development System
Triumph Aerospace Group
:-)

PD. Unas tazas de cafe o una coca cola te servira, tomalo con calma.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Coquito (79 intervenciones) el 26/07/2011 05:46:14
Gracias Zeus... eres un mitologico en computacion y generosidad...
Te cuento que empece por lo mas facil... cafe y cocacola alternativamente... por lo menos esto funciono como lo esperaba... excelente insinuacion...
Trabaje en Excel 2010... Spanish
*** Con SendKeys(Keys, Wait)... entusiasmado busque en F1... copie el ejemplo... abrio la calculadora me entusiasmo y... fiasco... fallo... no hubo numeros nada... escribio en el editor...
*** He curiosado Cutworks de Gerber Technology, para encontrar inspiracion... excelente maquina
*** Los comandos que mencionas...GetWindows, EnumChildWindows, SetForegroundWindow etc.. etc... me han aumentado los gases en el aparato digestivo aun no los digiero... ahora estoy buscando un analgesico en el excelente enlace que me proporcionas...http://msdn.microsoft.com/en-us/library/ms632595(v=VS.85).aspx
*** Ahora todo lo tengo atorado... no debo hacer un clavado debo caer de "panza"...
En fin gracias... eres fantastico... me esta sirviendo... porque me hace ver... que quiero jugar mejor y ser mas ilustrado que "Messi"...
Me agradara mucho compartir contigo el Cafe y la Cocacola... uno un dia y el otro en otro...
Un saludo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Ing Zeus Alberto Paez Renteria (26 intervenciones) el 26/07/2011 17:09:31
Ese problema de tu send Keys es porque el focus de tu programa esta en Excel asi que debes cambiar el Focus con el SetForegroundWindows para ello te serviran los siguientes codigos que buscan obtener el Handle del una ventana

Private Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long

Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

'Custom structure for passing in the parameters in/out of the hook enumeration function
'Could use global variables instead, but this is nicer :-)

Private Type FindWindowParameters

strTitle As String 'INPUT
hWnd As Long 'OUTPUT

End Type

Public Function FnFindWindowLike(strWindowTitle As String) As Long

'We'll pass a custom structure in as the parameter to store our result...
Dim Parameters As FindWindowParameters
Parameters.strTitle = strWindowTitle ' Input parameter

Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))

FnFindWindowLike = Parameters.hWnd

End Function

Private Function EnumWindowProc(ByVal hWnd As Long, _
lParam As FindWindowParameters) As Long

Dim strWindowTitle As String

strWindowTitle = Space(260) 'Space(260)
Call GetWindowText(hWnd, strWindowTitle, 260)
strWindowTitle = TrimNull(strWindowTitle) ' Remove extra null terminator

If strWindowTitle Like "*" & lParam.strTitle & "*" Then

lParam.hWnd = hWnd 'Store the result for later.
EnumWindowProc = 0 'This will stop enumerating more windows

Else

EnumWindowProc = 1

End If

End Function

Private Function TrimNull(strNullTerminatedString As String)

Dim lngPos As Long

'Remove unnecessary null terminator
lngPos = InStr(strNullTerminatedString, Chr(0))

If lngPos Then
TrimNull = Left$(strNullTerminatedString, lngPos - 1)
Else
TrimNull = strNullTerminatedString
End If

End Function

Puedes utilizar ReturnValue = FnFindWindowLike("Notepad")
Para tus pruebas con el codigo de arriba y luego.

Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long

SetForegroundWindow (ReturnValue)

y por ultimo el SendKeys.

Saludos.

Att. Ing. Zeus Paez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

Lectura de un sector de pantalla de otra aplicacion...

Publicado por JuanC (565 intervenciones) el 26/07/2011 13:40:02
hola Coquito
si pudieras ser más explícito con el planteo de tu problema creo que puedo ayudarte...
qué es un sector rectangular de la pantalla? otra aplicación?
querés intercambiar datos entre 2 libros o 2 aplicaciones diferentes?

según el caso hay formas y formas de hacerlo...

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Coquito (79 intervenciones) el 26/07/2011 21:47:14
Gracias JuanC... leo tus ayudas y aportes... fiuuuuu tienes muchas intervenciones... te esperaba...
En efecto tengo 2 aplicaciones diferentes... Excel y http://www.xe.com/ucc/es/... Desde una celda de Excel (o un comando de Excel ) deseo manipular y trasaladar el valor que se encuentra "en un sector rectangular" de esta otra aplicacion o de cualquier otra no precisamente Excel.
Agradesco tu interes... me agradara mucho ver tu forma de hacerlo... y tu presencia en el cafecito que le invite a Zeus... que fjijo nos lee...
Un saludo... Desde Cusco-Peru.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Ing. Zeus Alberto Paez Renteria (26 intervenciones) el 26/07/2011 23:45:19
Bien creo que con los codigos que te he enviado, colocalos todos en un module de excel y ejecuta el ExplorerGetNow, para ello deberas tener abierta la pagina web que mencionas http://www.xe.com/ucc/es/
Asi con este codigo capturas el Objeto Internet Explorer pero tomas especificamente a la pagina que deseas mediante el handle
handleIE = FnFindWindowLike("El Universal Currency Converter")
luego capturas el elemento "Amount" que es el text box donde le colocas la cantidad a convertir
en el ejemplo le escribo hola pero tambien puedes tomar la cantidad que tenga ese campo.("introduzca la cantidad correspondiente") basicamente tomas control de la webpage y puedes manipular datos esto es un ejemplo la verdad no se que campo quieras especificamente manipular.
El codigo AmountTB(0).Value = "Hola" es tanto para Input
Como para output Valor = AmountTB(0).value

No se que mas quieres hacer ya con esas herramientas.

Public Sub ExplorerGetNow()
Dim myIE As SHDocVw.InternetExplorer
Dim handleIE As String
Dim IExp As Object
Dim shl, wins, i, winIE, result
Set shl = CreateObject("Shell.Application")
Set wins = shl.Windows
handleIE = FnFindWindowLike("El Universal Currency Converter")
For i = 0 To wins.Count - 1
Set winIE = wins.Item(i)
On error Resume Next
result = winIE.hwnd
If err<>0 then err.clear
If result Like "*" & handleIE & "*" Then
With winIE
Set AmountTB = winIE.Document.getElementsByName("Amount")
If Not AmountTB Is Nothing Then
‘Aqui obtienes informacion del elemento de la webpage
AmountTB(0).Value = "Hola"
End If
‘Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
‘ DoEvents
‘ Loop
End With
End If
Next
End Sub

Saludos
Atentamente: Ing. Zeus Alberto Paez Renteria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Coquito (79 intervenciones) el 27/07/2011 03:38:45
Zeus... Gracias por hacer tuya... mis preocupaciones e ideas... sos genial
Con sinceridad... estoy tratando de entender tu codigo e ilustrandome de tus comandos (Muchos no estan en el Help de VBA... probabable por no ser usuales o despectivamente eliminados en nuestro idioma).
Los pegue... aun falta depurarlos...
En efecto... se me ocurrio manejar desde Excel la www de cambio de divisas que utilizo con frecuencia... de diferentes divisas... evitandome los pasos repetitivos...
Como dijiste... debo estar consciente que tengo que utilizar comandos de Windows... tu enlace
http://msdn.microsoft.com/en-us/library/ms632595(v=VS.85).aspx me esta ayudando... gracias si me enviases otros.
Como te decia... si en un tiempo no "juego" o me "ilustro" como Messi... caballero nomas tengo que mirar mas detenidamente a mi "sancho"
Si encontrase el molino de viento... lo publicare... sin tu ayuda no hubiese encontrado el camino... pero son tantos... como los que nos estan leyendo
Gracias...
P.D... Un comercial... Gustoso y grat... te servire de guia y anfitrion aqui en Cusco (Machupicchu)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Ing. Zeus Alberto Paez Renteria (26 intervenciones) el 27/07/2011 16:37:00
Si colocas todos los codigos en un module de excel y abres la pagina del cambio de divisas deberia trabajar sin problemas (en teoria) :-)

Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long

Private Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long

Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

'Custom structure for passing in the parameters in/out of the hook enumeration function
'Could use global variables instead, but this is nicer :-)

Private Type FindWindowParameters

strTitle As String 'INPUT
hWnd As Long 'OUTPUT

End Type

Public Function FnFindWindowLike(strWindowTitle As String) As Long
'We'll pass a custom structure in as the parameter to store our result...
Dim Parameters As FindWindowParameters
Parameters.strTitle = strWindowTitle ' Input parameter
Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))
FnFindWindowLike = Parameters.hWnd
End Function

Private Function EnumWindowProc(ByVal hWnd As Long, _
lParam As FindWindowParameters) As Long

Dim strWindowTitle As String

strWindowTitle = Space(260) 'Space(260)
Call GetWindowText(hWnd, strWindowTitle, 260)
strWindowTitle = TrimNull(strWindowTitle) ' Remove extra null terminator

If strWindowTitle Like "*" & lParam.strTitle & "*" Then
lParam.hWnd = hWnd 'Store the result for later.
EnumWindowProc = 0 'This will stop enumerating more windows
Else
EnumWindowProc = 1
End If
End Function

Private Function TrimNull(strNullTerminatedString As String)
Dim lngPos As Long
'Remove unnecessary null terminator
lngPos = InStr(strNullTerminatedString, Chr(0))

If lngPos Then
TrimNull = Left$(strNullTerminatedString, lngPos - 1)
Else
TrimNull = strNullTerminatedString
End If
End Function

Public Sub ExplorerGetNow()
Dim myIE As SHDocVw.InternetExplorer
Dim handleIE As String
Dim IExp As Object
Dim shl, wins, i, winIE, result
Set shl = CreateObject("Shell.Application")
Set wins = shl.Windows
handleIE = FnFindWindowLike("El Universal Currency Converter")
For i = 0 To wins.Count - 1
Set winIE = wins.Item(i)
On error Resume Next
result = winIE.hwnd
If err<>0 then err.clear
If result Like "*" & handleIE & "*" Then
With winIE
Set AmountTB = winIE.Document.getElementsByName("Amount")
If Not AmountTB Is Nothing Then
‘Aqui obtienes informacion del elemento de la webpage
AmountTB(0).Value = "Hola"
End If
‘Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
‘ DoEvents
‘ Loop
End With
End If
Next
End Sub

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Coquito (79 intervenciones) el 29/07/2011 01:35:55
Gracias Zeus... nuevamente...
el codigo que envias y dices... "...trabajar sin problemas (en teoria) :-)
no ha superado el.... option explicit
... aun persisto con tu codigo... gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura de un sector de pantalla de otra aplicacion...

Publicado por Ing. Zeus Alberto Paez Renteria (26 intervenciones) el 29/07/2011 19:31:06
Pues si te da lata el option Explicit, bueno pues quitalo y ve revisa que funcione... jeje

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar