Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Trabajar con ventanas (VBS)

Estas en el tema de Trabajar con ventanas (VBS) en el foro de Visual Basic clásico en Foros del Web. Hola, No sé si es el mejor sitio para dejar el mensaje por estar pensando en Visual Basic Script en lugar de VB6 o VB.NET... ...
  #1 (permalink)  
Antiguo 22/02/2008, 14:00
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Trabajar con ventanas (VBS)

Hola,

No sé si es el mejor sitio para dejar el mensaje por estar pensando en Visual Basic Script en lugar de VB6 o VB.NET...

Necesito ayuda con un asunto que desde VB6 tengo entendido que es posible pero en VBS no sé si se podrá, me explico:

En el fondo es una "chorrada", tengo un script en el que abro algunos programas con los métodos EXEC y/o RUN de un objeto WSCRIPT.SHELL, lo que quiero hacer, es que la ventana de cada uno de éstos programas se abra con un tamaño especifico en una posición especifica de la pantalla.

Sé que puedo usar una variable para tener la referencia a esa ventana/programa usando SET a la hora de invocar al método EXEC o RUN, pero a partir de ahí me encuentro sin saber que hacer, ya que con un script de éste tipo no puedo llamar a las API de Windows, verdad ?

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 25/02/2008, 12:04
Usuario no validado
 
Fecha de Ingreso: mayo-2006
Mensajes: 42
Antigüedad: 18 años
Puntos: 0
Re: Trabajar con ventanas (VBS)

Segun lei alguna vez si se puede mandar a llamar un API desde el vbs pero es un poco complicado ya que tienes que implementar otro control ...

Lo mas preferible es que lo hagas directamente involucrando las APIS.

API:
RedrawWindow
Requires Windows NT 3.1 or later; Requires Windows 95 or later
The RedrawWindow function updates the specified rectangle or region in a window’s client area.


Const RDW_INVALIDATE = &H1
Const BS_HATCHED = 2
Const HS_CROSS = 4
Private Type LOGBRUSH
lbStyle As Long
lbColor As Long
lbHatch As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function CreateBrushIndirect Lib "gdi32" (lpLogBrush As LOGBRUSH) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetRectEmpty Lib "user32" (lpRect As RECT) As Long
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function IsRectEmpty Lib "user32" (lpRect As RECT) As Long
Private Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long
Private Declare Function RedrawWindow Lib "user32" (ByVal hwnd As Long, lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long
Private Declare Function GetRgnBox Lib "gdi32" (ByVal hRgn As Long, lpRect As RECT) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Sub Form_Load()

'Check if this window is a window
If IsWindow(Me.hwnd) = 0 Then
MsgBox "Hmm.. I hope you altered the code, or else your system is meeting with difficulties!", vbInformation
End If
'API uses pixels
Me.ScaleMode = vbPixels
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Redraw this window (invoke a Paint-event)
RedrawWindow Me.hwnd, ByVal 0&, ByVal 0&, RDW_INVALIDATE
End Sub
Private Sub Form_Paint()
Dim LB As LOGBRUSH, R As RECT, Rgn As Long, RgnRect As RECT, hBrush As Long
'randomize
Randomize Timer
LB.lbColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))
LB.lbStyle = BS_HATCHED
LB.lbHatch = HS_CROSS
'Create a new brush
hBrush = CreateBrushIndirect(LB)
'Set the rectangle's values
SetRect R, 0, 0, 200, 200
'Create a rectangle region
Rgn = CreateRectRgn(100, 50, 300, 10)
'Get the region box
GetRgnBox Rgn, RgnRect
'calculate the intersection of two rectangles
IntersectRect R, RgnRect, R
'Empty the rectangle
SetRectEmpty RgnRect
'Fill our rectangle
FillRect Me.hdc, R, hBrush
'delete our brush
DeleteObject hBrush
'Check if the rectangle is empty
If IsRectEmpty(RgnRect) <> 0 Then SetRectEmpty RgnRect
End Sub
  #3 (permalink)  
Antiguo 25/02/2008, 12:06
Usuario no validado
 
Fecha de Ingreso: mayo-2006
Mensajes: 42
Antigüedad: 18 años
Puntos: 0
Re: Trabajar con ventanas (VBS)

SetWindowPos
Requires Windows NT 3.1 or later; Requires Windows 95 or later

The SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.




Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Activate()
'Set the window position to topmost
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
  #4 (permalink)  
Antiguo 27/02/2008, 16:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Trabajar con ventanas (VBS)

Vaya "kakao" la primera de las funciones... no lo veo no lo veo..

Estoy tratando de hacerlo con SetWindowPos, pero no acabo de hacer que funcione... simplemente no consigo nada, el código que me devuelve es 1 siempre... y según documentación... en caso de error devuelve 0 y en caso de funcionar bien algo diferente de 0... pero vamos, que la ventana no hay forma de moverla...

Nadie ha utilizado ésta función para hacer algo que no sea poner una ventana siempre visible (dichoso "TOPMOST") ??? Porque ese es el único ejemplo que se encuentro buscando en la red... y me estoy crispando xD

Bueno, un saludo y gracias por las respuestas.
  #5 (permalink)  
Antiguo 27/02/2008, 16:40
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Trabajar con ventanas (VBS)

Bueno, me explico un poco mejor en mi caso concreto...

Sí, veo que haciendolo en VB pasando como hWnd me.hwnd el formulario se mueve, redimensiona, etc.. etc.. como tiene que ser, perfecto.

Pero tratando de pasarle el hWnd de otra ventana no tengo resultado...

Claro, es posible que el hWnd directamente lo pase mal... que eso a fin de cuentas ya es otro problema diferente...

Ummmmm
Seguiré investigando..
Gracias
  #6 (permalink)  
Antiguo 28/02/2008, 09:33
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Trabajar con ventanas (VBS)

Bueno, la necesidad queda solventada. Lo único que no he logrado hacerlo integramente en VBS...

Un saludo y gracias de nuevo.
  #7 (permalink)  
Antiguo 28/02/2008, 11:02
Usuario no validado
 
Fecha de Ingreso: mayo-2006
Mensajes: 42
Antigüedad: 18 años
Puntos: 0
Re: Trabajar con ventanas (VBS)

La unica forma que se me ocurre es que crees una instancia de ieplorer y el formulario lo presentes por html ... al menos de esa forma se me ocurre que puedes redimensionar el form ...

Saludos

Cita:
Iniciado por c_keeper Ver Mensaje
Bueno, la necesidad queda solventada. Lo único que no he logrado hacerlo integramente en VBS...

Un saludo y gracias de nuevo.
  #8 (permalink)  
Antiguo 28/02/2008, 15:53
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Trabajar con ventanas (VBS)

El problema ahora era la función para obtener el hWnd a partir de PID, que al usarla en VBS con las particularidades de éste no funcionaba, supongo que por problemas de tipos, parámetros que se tenian que pasar por valor y demás...

Pero bueno, la cosa es que ya he encontrado la forma de hacer lo que queria.

Muchas gracias por la ayuda.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:24.