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 FunctionEste 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
Si quieres bajarte el código, pulsa este link (gsTaskBar.zip 5.63 KB)