POSICION DE VENTANA

05/07/2007 - 08:42 por Orfao | Informe spam
Hola...
Desde una macro invoco la calculadora de windows...
como hago para que se ubique en una posicion especifica cada vez que la
active.
En el mismo windows "noto" que si abro y cierro sucesivamente la
calculadora esta de va desplazando desde la esquina superior izquierda a la
inferior derecha...???
Mientras que en excel siempre se abre arriba y a la izquierda y deseo que
se abra en otra posicion (para no ocultar ciertos datos de la hoja) y no
tener que moverla manualmente a cada apertura .

Me alimento del conocimiento de todos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
06/07/2007 - 00:07 | Informe spam
hola, moises !

... macro invoco la calculadora de windows... como hago para que se ubique en una posicion especifica cada vez que la active.
... si abro y cierro sucesivamente la calculadora esta de va desplazando desde la esquina superior izquierda a la inferior derecha...???
... en excel... deseo que se abra en otra posicion (para no ocultar ciertos datos de la hoja) y no tener que moverla manualmente ..



1) copia/pega las siguientes lineas [p.e.] en un modulo de codigo 'normal'

Option Private Module
Declare Function BuscaVentana Lib "user32" Alias "FindWindowA" ( _
ByVal Clase As String, ByVal Titulo As String) As Long
Declare Function MueveVentana Lib "user32" Alias "MoveWindow" ( _
ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
ByVal Ancho As Long, ByVal Alto As Long, ByVal Refresca As Long) As Long
Declare Function DimensionesDeVentana Lib "user32" Alias "GetWindowRect" ( _
ByVal hWnd As Long, xDim As Dimensiones) As Long
Type Dimensiones
Left As Long: Top As Long: Right As Long: Bottom As Long
End Type
Function LanzaCalculadora(Izq As Long, Arriba As Long)
Dim Calculadora As Long, d As Dimensiones
Shell "calc.exe", vbNormalFocus
Calculadora = BuscaVentana(vbNullString, "Calculadora") ' <= OJO con el idioma '
DimensionesDeVentana Calculadora, d
MueveVentana Calculadora, Izq, Arriba, d.Right - d.Left, d.Bottom - d.Top, 1
End Function

2) despues podras utilizar la funcion [LanzaCalculadora] agregando los parametros de *donde* quieres que se muestre
o sea, las coordenadas de inicio [medidas en puntos de pantalla de windows]: x-Izquierda / y-Arriba [p.e.]

Sub Prueba()
LanzaCalculadora 350, 200
End Sub

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Orfao
06/07/2007 - 02:26 | Informe spam
Gracias Miguel.
Perfecto.. Me sirve para lo que necesito.
Pro curiosidad pregunto:
Habria forma de usar aapactivate en vez de shell
porque en el segundo caso no verifica si ya esta abierta
y otra cosa... hay forma de que se abra directamente en la nueva posicion
sin necesidad de moverla (para evitar el parpadeo que genera el movimiento)???

Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> ... macro invoco la calculadora de windows... como hago para que se ubique en una posicion especifica cada vez que la active.
> ... si abro y cierro sucesivamente la calculadora esta de va desplazando desde la esquina superior izquierda a la inferior derecha...???
> ... en excel... deseo que se abra en otra posicion (para no ocultar ciertos datos de la hoja) y no tener que moverla manualmente ..

1) copia/pega las siguientes lineas [p.e.] en un modulo de codigo 'normal'

Option Private Module
Declare Function BuscaVentana Lib "user32" Alias "FindWindowA" ( _
ByVal Clase As String, ByVal Titulo As String) As Long
Declare Function MueveVentana Lib "user32" Alias "MoveWindow" ( _
ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
ByVal Ancho As Long, ByVal Alto As Long, ByVal Refresca As Long) As Long
Declare Function DimensionesDeVentana Lib "user32" Alias "GetWindowRect" ( _
ByVal hWnd As Long, xDim As Dimensiones) As Long
Type Dimensiones
Left As Long: Top As Long: Right As Long: Bottom As Long
End Type
Function LanzaCalculadora(Izq As Long, Arriba As Long)
Dim Calculadora As Long, d As Dimensiones
Shell "calc.exe", vbNormalFocus
Calculadora = BuscaVentana(vbNullString, "Calculadora") ' <= OJO con el idioma '
DimensionesDeVentana Calculadora, d
MueveVentana Calculadora, Izq, Arriba, d.Right - d.Left, d.Bottom - d.Top, 1
End Function

2) despues podras utilizar la funcion [LanzaCalculadora] agregando los parametros de *donde* quieres que se muestre
o sea, las coordenadas de inicio [medidas en puntos de pantalla de windows]: x-Izquierda / y-Arriba [p.e.]

Sub Prueba()
LanzaCalculadora 350, 200
End Sub

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
06/07/2007 - 05:19 | Informe spam
hola, moises !

... Me sirve para lo que necesito. Pro curiosidad pregunto:
Habria forma de usar aapactivate en vez de shell porque en el segundo caso no verifica si ya esta abierta
y otra cosa... hay forma de que se abra directamente en la nueva posicion sin necesidad de moverla
(para evitar el parpadeo que genera el movimiento)???



1) appactivate *requiere* que la aplicacion ya este *corriendo* [supongo que]...
[al menos] la primera vez que la solicites, deberas usar una instruccion *shell* [o algo parecido] :D
[te paso mdificaciones a la funcion *LanzaCalculadora* al final del presente] ;)

2) para que se abra *directamente* donde la necesites [sin necesidad de moverla] -?-
y dado que el *efecto* de parpadeo lo provoca el uso de la API *MoveWindow* por su ultimo parametro...
-> con el procedimiento *sugerido* NO verias ese parpadeo... siempre y cuando la *actives* en el ultimo lugar mostrado :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

' modificaciones a la funcion ... '
Function LanzaCalculadora(Izq As Long, Arriba As Long)
Dim Calculadora As Long, d As Dimensiones
On Error Resume Next: AppActivate "Calculadora": ' AppActivate Application.Caption
If Err Then Shell "calc.exe", vbNormalNoFocus: ' AppActivate Application.Caption
Calculadora = BuscaVentana(vbNullString, "Calculadora") ' <= OJO con el idioma '
DimensionesDeVentana Calculadora, d
MueveVentana Calculadora, Izq, Arriba, d.Right - d.Left, d.Bottom - d.Top, 1
AppActivate "Calculadora"
End Function

p.d. otras alternativas para no usar el appactivate inicial [para verificar si ya esta corriendo], pudieran ser:
usar bucles y mas llamadas a otras API's para preguntar si la calculadora es de las aplicaciones *activas*
ejemplos en la pagina de Randy Birch:
-> Visual Basic Enumeration/Callback Routines
EnumWindows: Enumerate Windows via a Callback
http://vbnet.mvps.org/code/enums/enumwindows.htm
Respuesta Responder a este mensaje
#4 Orfao
06/07/2007 - 05:48 | Informe spam
Hola Miguel...
Yo usaba el siguiente codigo...
(solo me faltaba moerla)

Sub StartCalculator()
Dim AppFile As String
Dim CalcTaskID As Double
AppFile = "Calc.exe"
On Error Resume Next
AppActivate "Calculadora"
If Err <> 0 Then
Err = 0
CalcTaskID = Shell(AppFile, 1)
If Err <> 0 Then MsgBox "Calculadora No disponible"
End If
End Sub

Con el modelo que tu me sugieres...no veo el parpadeo siempre y cuando
mantenga abierta la calculadora (aunque no activa) pero si la cierro vuelve a
su ubicacion inicial...

No podria yo mas bien... abrirla dentro de otra ventana (un formulario por
ejemplo) ??
o acaso me estoy complicando la eistencia ??

Gracias...
Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> ... Me sirve para lo que necesito. Pro curiosidad pregunto:
> Habria forma de usar aapactivate en vez de shell porque en el segundo caso no verifica si ya esta abierta
> y otra cosa... hay forma de que se abra directamente en la nueva posicion sin necesidad de moverla
> (para evitar el parpadeo que genera el movimiento)???

1) appactivate *requiere* que la aplicacion ya este *corriendo* [supongo que]...
[al menos] la primera vez que la solicites, deberas usar una instruccion *shell* [o algo parecido] :D
[te paso mdificaciones a la funcion *LanzaCalculadora* al final del presente] ;)

2) para que se abra *directamente* donde la necesites [sin necesidad de moverla] -?-
y dado que el *efecto* de parpadeo lo provoca el uso de la API *MoveWindow* por su ultimo parametro...
-> con el procedimiento *sugerido* NO verias ese parpadeo... siempre y cuando la *actives* en el ultimo lugar mostrado :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

' modificaciones a la funcion ... '
Function LanzaCalculadora(Izq As Long, Arriba As Long)
Dim Calculadora As Long, d As Dimensiones
On Error Resume Next: AppActivate "Calculadora": ' AppActivate Application.Caption
If Err Then Shell "calc.exe", vbNormalNoFocus: ' AppActivate Application.Caption
Calculadora = BuscaVentana(vbNullString, "Calculadora") ' <= OJO con el idioma '
DimensionesDeVentana Calculadora, d
MueveVentana Calculadora, Izq, Arriba, d.Right - d.Left, d.Bottom - d.Top, 1
AppActivate "Calculadora"
End Function

p.d. otras alternativas para no usar el appactivate inicial [para verificar si ya esta corriendo], pudieran ser:
usar bucles y mas llamadas a otras API's para preguntar si la calculadora es de las aplicaciones *activas*
ejemplos en la pagina de Randy Birch:
-> Visual Basic Enumeration/Callback Routines
EnumWindows: Enumerate Windows via a Callback
http://vbnet.mvps.org/code/enums/enumwindows.htm



Respuesta Responder a este mensaje
#5 Héctor Miguel
06/07/2007 - 06:20 | Informe spam
hola, moises !

Yo usaba el siguiente codigo... (solo me faltaba moerla)



=> [precisamente]... en el *moverla*... esta *el detalle*
[y el parpadeo, segun los comentarios anteriores] :))

Con el modelo que tu me sugieres...no veo el parpadeo siempre y cuando mantenga abierta la calculadora
(aunque no activa) pero si la cierro vuelve a su ubicacion inicial...



=> tambien esta comentado en el mensaje anterior ;) [ademas]...
no pierdas de vista que la calculadora es una aplicacion *independiente* y... al *arrancar* las aplicaciones...
las ventanas las *acomoda* el usuario... o *se lo deja* a windows [y su ambiente multi-tareas]

No podria yo mas bien... abrirla dentro de otra ventana (un formulario por ejemplo) ??



=> lo que podrias haces es *simular* una calculadora por controles y codigo en un formulario ;)
[de la forma que planteas... que te impediria *meter* word o excel o... -> dentro de un formulario ???]

prueba descargando un ejemplo para crear 'al vuelo' una calculadora que interactua con excel en...
-> http://j-walk.com/ss/excel/tips/tip90.htm

o acaso me estoy complicando la eistencia ??



=> creo que... si :D
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida