cTaskBar

Clase para "manipular" la Barra de tareas (al menos algunas cosas)

 

Publicado el 28/Sep/98
Revisión del 28/Sep/98


Esta clase intenta "manipular" la barra de tareas de Windows, es decir la que tiene el menú de Inicio y los iconos del reloj y otras cosillas...
El poner entre comillas lo de manipular es porque esa es la intención, aunque no se deja demasiado... al menos algunas de las posiblidades, que ahora veremos cuales son o deberían ser... si consigo algo nuevo, no dudes que lo publicaré...

Pero vamos con lo que hay y cuando haya más cosas, ya las veremos.

 

¿Que hace esta clase?

Esta clase permite hacer lo siguiente:

  • Obtiene el estado actual de la barra de tareas, es decir si está en modo Siempre Visible y si está en modo de Ocultar automáticamente.
  • Permite mostrar y ocultar la barra de tareas, pero no en modo de Ocultar automáticamente, simplemente la oculta o la muestra.
  • En teoría permitiría cambiar el estado de Siempre Visible y Ocultar Automáticamente, pero en la práctica sólo hace la primera, aunque ese cambio no se refleja en las propiedades de la barra de tareas... no me preguntes porqué, pero no lo hace...

 

¿Cómo se usa la clase?

Pues como la mayoría de las clases:
Tienes que declarar una variable de este tipo y a continuación usar los métodos y propiedades.

Por ejemplo para ocultar la barra de tareas:

'Dimensiomos una variable de este tipo
Dim m_TaskBar As cTaskBar

'La creamos
Set m_TaskBar = New cTaskBar

'Llamamos al método que la oculta
m_TaskBar.Hide

 

Un ejemplo y los listados de la clase.

Vamos a ver el listado de la clase, debes tener en cuenta que no funciona la asignación de que se oculte de forma automática, si alguien sabe cómo hacerlo, pero en la práctica, ya que en la teoría si que la se, que me lo diga, gracias.

'La clase cTaskBar.cls

'--------------------------------------------------------------------------------------
'cTaskBar.cls Clase para manipular la barra de tareas (taskbar)             (28/Sep/98)
'
'©Guillermo 'guille' Som, 1998
'
'Versión 0.0.xxxx   28/Sep/98
'
'Métodos:
'   Save        Guarda los valores actuales
'   Restore     Restaura los valores que había al crear la clase o al guardar (*)
'   Hide        Oculta la barra de tareas
'   Show        Muestra la barra de tareas
'Propiedades:
'   AlwaysOnTop Devuelve o cambia el estado de Siempre visible
'   AutoHide    Devuelve o cambia el estado de Ocultar automáticamente (*)
'
'(*) No funciona la asignación de AutoHide (Ocultar automáticamente)
'
'--------------------------------------------------------------------------------------
Option Explicit

'Valores privados para el estado de la barra de tareas
Private m_AlwaysOnTop       As Boolean
Private m_AutoHide          As Boolean

'Valores del estado incial o el usado con el método Save
Private m_Saved_AlwaysOnTop As Boolean
Private m_Saved_AutoHide    As Boolean

'
Private m_hWnd              As Long ' El hWnd de la barra de tareas
Private m_uEdge             As Long ' La localización de la barra de tareas
Private m_Pos               As RECT ' Las coordenadas de la posición de la barra de tareas
'
'Los comentarios y los valores están sacados del fichero ShellAPI.h
'y de la ayuda Win32.hlp
'
'Constantes
Public Enum eTaskBar
    'Valores para dwMessage, Identifier of the appbar message to send
    '
    ABM_NEW = &H0           ' Registers a new appbar and specifies the message identifier that the system should use to send notification messages to the appbar
    ABM_REMOVE              ' Unregisters an appbar, removing bar from the system's internal list
    ABM_QUERYPOS            ' Requests a size and screen position for an appbar
    ABM_SETPOS              ' Sets the size and screen position of an appbar
    ABM_GETSTATE            ' Retrieves the autohide and always-on-top states of the Windows taskbar
    ABM_GETTASKBARPOS       ' Retrieves the bounding rectangle of the Windows taskbar
    ABM_ACTIVATE            ' Notifies the system that an appbar has been activated
                            '   // lParam == TRUE/FALSE means activate/deactivate
    ABM_GETAUTOHIDEBAR      ' Retrieves the handle of the autohide appbar associated with a particular edge of the screen
    ABM_SETAUTOHIDEBAR      ' Registers or unregisters an autohide appbar for an edge of the screen
                            '   // this can fail at any time.  MUST check the result
                            '   // lParam = TRUE/FALSE  Set/Unset
                            '   // uEdge = what edge
    ABM_WINDOWPOSCHANGED    ' Notifies the system when an appbar's position has changed
    '
    '// these are put in the wparam of callback messages
    ABN_STATECHANGE = &H0   ' 0x0000000
    ABN_POSCHANGED = &H1    ' 0x0000001
    ABN_FULLSCREENAPP = &H2 ' 0x0000002
    ABN_WINDOWARRANGE = &H3 ' 0x0000003 // lParam == TRUE means hide
End Enum
    '
Public Enum eTaskBarFlags
    '// flags for get state
    ABS_NONE = &H0          ' No es ni AutoHide ni AlwaysOntop
    ABS_AUTOHIDE = &H1      ' Es AutoHide
    ABS_ALWAYSONTOP = &H2   ' Es AlwaysOnTop
End Enum
    '
Public Enum eTaskBarEdge
    ' Usados para especificar los límites de la pantalla (ver uEdge)
    ABE_LEFT = &H0          ' 0
    ABE_TOP = &H1           ' 1
    ABE_RIGHT = &H2         ' 2
    ABE_BOTTOM = &H3        ' 3
End Enum

'Tipos definidos
Private Type RECT
    Left    As Long
    Top     As Long
    Right   As Long
    Bottom  As Long
End Type

Private Type APPBARDATA
    cbSize              As Long ' sizeof(APPBARDATA)
    hWnd                As Long ' handle of appbar
    uCallbackMessage    As Long ' Application-defined message identifier.
                                ' The application uses the specified identifier for notification messages
                                ' that it sends to the the appbar identified by the hWnd member.
                                ' This member is used when sending the ABM_NEW message
    uEdge               As Long ' Flag that specifies an edge of the screen.
                                ' This member can be one of the following values:
                                ' ABE_LEFT, ABE_RIGHT, ABE_BOTTOM, ABE_TOP
    rc                  As RECT ' RECT structure that contains the bounding rectangle,
                                ' in screen coordinates, of an appbar or the Windows taskbar.
                                ' This member is used when sending the ABM_GETTASKBARPOS, ABM_QUERYPOS, and ABM_SETPOS messages
    lParam              As Long ' Message-dependent value.
                                ' This member is used with the ABM_SETAUTOHIDEBAR message
End Type

'Función del API
'   dwMessage   Identifier of the appbar message to send.
'   pabd        Pointer to an APPBARDATA structure.
'               The content of the structure depends on the value of dwMessage.
'
'   Returns a message-dependent value. For more information, see the documentation for the individual appbar messages
'
Private Declare Function SHAppBarMessage Lib "shell32.dll" _
    (ByVal dwMessage As Long, pData As APPBARDATA) As Long

'
''Para notificar a la barra de tarea que se han cambiado los valores
'Const WM_WINDOWPOSCHANGED = &H47
'
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
'    (ByVal hWnd As Long, ByVal wMsg As Long, _
'    ByVal wParam As Long, lParam As Any) As Long
'

'Los métodos para Ocultar y Mostrar la barra de tareas,
'lo saqué de un post de las news enviado por: Jason Cueny

'Constantes para SetWindowsPos
'   Valores de wFlags
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Const SWP_HIDEWINDOW = &H80

'   Valores de hwndInsertAfter
Const HWND_TOP          As Long = 0
Const HWND_BOTTOM       As Long = 1
Const HWND_TOPMOST      As Long = -1
Const HWND_NOTOPMOST    As Long = -2

Private Declare Function 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) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Public Sub Hide()
    'Oculta la barra de tarea

    Call SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
End Sub


Public Sub Show()
    'Muestra la barra de tarea

    Call SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
End Sub


Public Sub Save()
    'Este método guarda el estado actual de la barra de tareas

    'Obtener el estado actual
    Call GetState
    'Guardar los valores
    m_Saved_AlwaysOnTop = m_AlwaysOnTop
    m_Saved_AutoHide = m_AutoHide
End Sub


Public Sub Restore()
    'Restaura el estado inicial o el guardado de la barra de tareas
    AlwaysOnTop = m_Saved_AlwaysOnTop
    AutoHide = m_Saved_AutoHide
End Sub


Private Sub Class_Initialize()
    'Asignar los valores iniciales
    m_hWnd = FindWindow("Shell_traywnd", "")

    'Obtener el tamaño y la posición de la barra de tareas
    Dim abd As APPBARDATA

    With abd
        .cbSize = Len(abd)
        .hWnd = m_hWnd
    End With
    Call SHAppBarMessage(ABM_GETTASKBARPOS, abd)

    'Asignar los valores a las variables a nivel de módulo
    With abd
        m_uEdge = .uEdge
        m_Pos.Bottom = .rc.Bottom
        m_Pos.Left = .rc.Left
        m_Pos.Right = .rc.Right
        m_Pos.Top = .rc.Top
    End With

    'Guardar los valores iniciales
    Save
End Sub


Public Property Get AlwaysOnTop() As Boolean
    'Devuelve el estado de Siempre visible
    'devolverá True si este valor está asignado
    '
    'Leer de nuevo el valor por si ha cambiado desde que se inició
    Call GetState
    AlwaysOnTop = m_AlwaysOnTop
End Property


Public Property Let AlwaysOnTop(ByVal bNewValue As Boolean)
    'Asigna el nuevo estado de Siempre visible
    '
    'ATENCION:  Este cambio no modifica el valor mostrado en las propiedades
    '           de la barra de tareas, pero si que modifica el estado
    '----------------------------------------------------------------------------------
    'Constante para los Flags de SetWindowPos
    Const wFlags As Long = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE

    'Sólo si ha cambiado desde la última vez
    If bNewValue <> m_AlwaysOnTop Then
        'Posicionarlo arriba o abajo, según el valor del parámetro
        Call SetWindowPos(m_hWnd, _
                        IIf(bNewValue, HWND_TOPMOST, HWND_BOTTOM), _
                            0, 0, 0, 0, wFlags)
        m_AlwaysOnTop = bNewValue
    End If

    'Esto es lo mismo que esto otro:
    '
    'If bNewValue Then
    '    Call SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, wFlags)
    'Else
    '    Call SetWindowPos(m_hWnd, HWND_BOTTOM, 0, 0, 0, 0, wFlags)
    'End If
End Property


Public Property Get AutoHide() As Boolean
    'Devuelve el estado de Ocultar automáticamente
    'devolverá True si este valor está asignado
    '
    'Leer de nuevo el valor por si ha cambiado desde que se inició
    Call GetState
    AutoHide = m_AutoHide
End Property


Public Property Let AutoHide(ByVal bNewValue As Boolean)
    'Asigna el nuevo estado de Ocultar automáticamente
    '
    '$No funciona...
    '
    '----------------------------------------------------------------------------------
    Dim abd As APPBARDATA
    Dim ret As Long

    'Sólo cambiarlo si el nuevo valor es diferente
    If bNewValue <> m_AutoHide Then
        '
        With abd
            .cbSize = Len(abd)
            .hWnd = m_hWnd
            .uEdge = m_uEdge
            .lParam = -1 * bNewValue
        End With
        ret = SHAppBarMessage(ABM_SETAUTOHIDEBAR, abd)
        'Asignar el nuevo valor
        m_AutoHide = bNewValue
    End If
End Property


Private Function GetState() As eTaskBarFlags
    'Obtiene los valores actuales de la barra de tareas
    Dim abd As APPBARDATA
    Dim i As Long

    With abd
        .cbSize = Len(abd)
        .hWnd = m_hWnd
    End With

    i = SHAppBarMessage(ABM_GETSTATE, abd)

    'Asignar los valores del estado actual
    m_AlwaysOnTop = i And ABS_ALWAYSONTOP
    m_AutoHide = i And ABS_AUTOHIDE

    'Devolver el valor, valdrá cero si no es AutoHide ni AlwaysOnTop
    GetState = i
End Function

Este es el listado y una imagen del form de ejemplo:
En los checkboxes del Frame "Estado al iniciarse..." no se muestra el texto, en su lugar hay unas etiquetas ya que estos sólo se usan para indicar si están seleccionados o no y no para cambiar el estado, por tanto, se deshabilitan una vez asignados los valores y para que no que "feo", se usan las etiquetas aparte, (esto lo he "tomado" de un ejemplo de
Francisco Charte que publicó en PCWorld precisamente sobre esto del TaskBar, aunque en honor a la verdad, no ha sido ese el motivo de crear la clase, sino por una consulta de Gabriel B. [email protected] que hizo en una lista de correo y después de forma particular).

 

 

Veamos el código del form de ejemplo:

'----------------------------------------------------------------------------------
'Ejemplo para manipular la barra de tareas (taskbar)                    (28/Sep/98)
'
'©Guillermo 'guille' Som, 1998
'----------------------------------------------------------------------------------
Option Explicit

Dim m_TaskBar As cTaskBar

'Constantes para el índice de los checkboxes
Const cAlwaysOnTop = 0
Const cAutoHide = 1


Private Sub cmdAplicar_Click()
    'Asignar los nuevos valores seleccionados
    m_TaskBar.AlwaysOnTop = chkActual(cAlwaysOnTop)
    m_TaskBar.AutoHide = chkActual(cAutoHide)
End Sub


Private Sub cmdMostrar_Click()
    m_TaskBar.Show
End Sub


Private Sub cmdOcultar_Click()
    m_TaskBar.Hide
End Sub


Private Sub cmdSalir_Click()
    'Restaurar los valores al entrar en el programa
    '
    'm_TaskBar.Restore

    Unload Me
End Sub


Private Sub Form_Load()
    'Iniciar el programa

    'Guardar los valores originales del estado de la barra de tareas
    Set m_TaskBar = New cTaskBar

    'Asignar los valores iniciales
    chkInicial(cAlwaysOnTop).Value = -1 * (m_TaskBar.AlwaysOnTop)
    chkInicial(cAutoHide).Value = -1 * (m_TaskBar.AutoHide)
    'Deshabilitarlos para no permitir cambiar, ya que sólo es a título informativo
    chkInicial(cAlwaysOnTop).Enabled = False
    chkInicial(cAutoHide).Enabled = False

    'Asignar los valores para cambiar mientras se está en el programa
    chkActual(cAlwaysOnTop).Value = chkInicial(cAlwaysOnTop).Value
    chkActual(cAutoHide).Value = chkInicial(cAutoHide).Value
End Sub


Private Sub Form_Unload(Cancel As Integer)
    'Mostrarla por si se ha ocultado con el programa
    m_TaskBar.Show

    'Destruir los objetos
    Set m_TaskBar = Nothing
    Set Form1 = Nothing
End Sub

ir al índice

Si quieres bajarte el código, pulsa este link (gsTaskBar.zip 5.63 KB)