• Domingo 22 de Diciembre de 2024, 13:41

Autor Tema:  Formulario siempre visible  (Leído 1394 veces)

Carlos Camargo

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Formulario siempre visible
« en: Viernes 1 de Mayo de 2009, 03:02 »
0
Buenas

Estoy elavorando una aplicacion en visual basic 6.0 y necesito que cuando se active me bloquee el escritorio y quede en encima de cualquier aplicacion windows incluyendo los juegos.


Gracias.
Código: Visual Basic
  1.  

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Formulario siempre visible
« Respuesta #1 en: Viernes 1 de Mayo de 2009, 05:42 »
0
Debes usar la api: 'SetWindowPos'
Esta es la declaración: Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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) As Long

Los parámetros son:
    hwnd : el hwnd  del formulario en cuestión.
    hWndInsertAfter:  este parámetro significa 2 cosas, o bien el hwnd del formulario sobre el que se posicionará debajo , o una constante que indica como se comporta en el orden Z,  estas constantes te las describo como una enumeración al final... en el ejemplo...
    X: la nueva posición horizontal
    y: la nueva posición vertical
    CX: el nuevo ancho que le quieres dar
    CY: el nuevo alto que le quieres dar
     wFlags: son estados para especificar más opciones de tamaño y posición, resulta bastante largo de especificar en detalle, por lo que lo omito...


Para probar el programa copia el código y pégalo a un nuevo proyecto, añade un botón y dale a ejecutar.... Ten en cuenta que los valores que lo colocan en primer plano son los valores -1 y 0 y el valor que le devuelve la 'normalidad' es el valor -2.

Código: Visual Basic
  1.  
  2. Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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) As Long
  3.  
  4. Private Const MOSTRAR_VENTANA = 64 ' es el flag que vamos a meter... en hexadecimal es H40
  5.  
  6. ' las constantes cuando el parámetro hWndInsertAfter utiliza constantes...
  7. private enum enPosicionZ
  8.     ORDEN_NORMAL= -2
  9.     ORDEN_EN_LA_CIMA= -1
  10.     ORDEN_ENCIMA=0
  11.     ORDEN_DEBAJO=1
  12. end enum
  13.  
  14. Private Type Rectangulo
  15.     X As Long
  16.     Y As Long
  17.     Ancho As Long
  18.     Alto As Long
  19. End Type
  20.  
  21. Private p_OrdenZ As enPosicionZ
  22. Private AreaF As Rectangulo
  23.  
  24. Friend Property Get OrdenZ() As enPosicionZ
  25.     OrdenZ = p_OrdenZ
  26. End Property
  27.      Friend Property Let OrdenZ(ByVal oz As enPosicionZ)
  28.            If p_OrdenZ <> oz Then
  29.               If oz > -3 And oz < 2 Then
  30.                 p_OrdenZ = oz
  31.                 Call getRect
  32.                 Call SetWindowPos(Me.hwnd, p_OrdenZ, AreaF.X, AreaF.Y, AreaF.Ancho, AreaF.Alto, MOSTRAR_VENTANA)
  33.                 msgBox("Nuevo orden z: " & p_OrdenZ)
  34.               End If
  35.            End If
  36.      End Property
  37.  
  38. Private Sub Command1_Click()
  39.     Static n As Integer
  40.    
  41.     n = n + 1
  42.     If n = 2 Then n = -2
  43.     OrdenZ = n
  44. End Sub
  45.  
  46. ' toma la posición y medidas actuales del Formulario
  47. Private Function getRect()
  48.     AreaF.X = ScaleX(Me.Left, vbTwips, vbPixels) + 0  ' previsto para añadir alguna variable
  49.     AreaF.Y = ScaleY(Me.Top, vbTwips, vbPixels) + 0
  50.     AreaF.Ancho = ScaleX(Me.Width, vbTwips, vbPixels) + 0
  51.     AreaF.Alto = ScaleY(Me.Height, vbTwips, vbPixels) + 0
  52. End Function
  53.  
  54.  
  55.  

Por último indicarte que no abuses de colocar ventanas encima del todo, deja que el usuario decida si le interesa o no. Sólo los malos programadores y las malas aplicaciones le quitan la decisión al usuario...

Nota: en el modo -1 comparte orden con el administrador de tareas, el que tenga el foco activo se coloca encima... es para evitar fantasmadas de lamers...

p.d.: se me olvidaba... para que se quede encima de la barra de tareas, debes maximizar la ventana y ponerla sin bordes, estos es, establece en diseño: windowstate=2 y borderstyle=0
«Ma non troppo»
----> ModoVacaciones = False<----