Uso de barras de herramientas de escritorio de aplicaciones

Una barra de herramientas de escritorio de aplicaciones (también denominada barra de aplicaciones) es una ventana similar a la barra de tareas de Windows. Está anclada a un borde de la pantalla y normalmente contiene botones que proporcionan al usuario acceso rápido a otras aplicaciones y ventanas. El sistema impide que otras aplicaciones usen el área de escritorio ocupada por la barra de aplicaciones. En el escritorio puede haber cualquier cantidad de barras de aplicaciones en un momento dado.

En este tema se incluyen las siguientes secciones.

Acerca de las barras de herramientas de escritorio de aplicaciones

Windows proporciona una API que permite aprovechar los servicios de barras de aplicaciones proporcionados por el sistema. Los servicios ayudan a garantizar que las barras de aplicaciones definidas por una aplicación funcionen sin problemas entre sí y con la barra de tareas. El sistema mantiene información sobre cada una de las barras de aplicaciones y les envía mensajes para notificarles eventos que puedan afectar a su tamaño, posición y apariencia.

enviar mensajes

Las aplicaciones usan un conjunto especial de mensajes, denominados mensajes de barra de aplicaciones, para agregar o quitar barras de aplicaciones, fijar el tamaño y la posición de las barras de aplicaciones y obtener información sobre el tamaño, la posición y el estado de la barra de tareas. Para enviar un mensaje de barra de aplicaciones, las aplicaciones deben usar la función SHAppBarMessage. Los parámetros de la función incluyen un identificador del mensaje, como ABM_NEW, y la dirección de una estructura APPBARDATA. Los miembros de la estructura contienen información que el sistema necesita para procesar el mensaje especificado.

Para cualquier mensaje de barra de aplicaciones determinado, el sistema usa algunos de los miembros de la estructura APPBARDATA y omite los demás. Sin embargo, el sistema siempre usa los miembros cbSize y hWnd, por lo que las aplicaciones deben rellenar estos miembros para cada mensaje de barra de aplicaciones. El miembro cbSize especifica el tamaño de la estructura, mientras que el miembro hWnd es el controlador de la ventana de la barra de aplicaciones.

Algunos mensajes de barra de aplicaciones solicitan información del sistema. Al procesar estos mensajes, el sistema copia la información solicitada en la estructura APPBARDATA.

Registro

El sistema mantiene una lista interna de barras de aplicaciones e información sobre cada barra de la lista. El sistema usa la información para administrar las barras de aplicaciones, realizar servicios para ellas y enviarles mensajes de notificación.

Las aplicaciones deben registrar una barra de aplicaciones (es decir, agregarla a la lista interna) para poder recibir servicios de barra de aplicaciones del sistema. Para registrar una barra de aplicaciones, las aplicaciones envían el mensaje ABM_NEW. La estructura APPBARDATA asociada incluye el identificador de la ventana de la barra de aplicaciones y un identificador de mensaje definido por la aplicación. El sistema usa el identificador de mensaje para enviar mensajes de notificación al procedimiento de ventana de la ventana de la barra de aplicaciones. Para obtener más información, consulte Mensajes de notificación de barra de aplicaciones.

Para anular el registro de una barra de aplicaciones, las aplicaciones envían el mensaje ABM_REMOVE. Al anular el registro de una barra de aplicaciones, esta se quita de la lista interna del sistema de barras de aplicaciones. El sistema ya no envía mensajes de notificación a la barra de aplicaciones ni impide que otras aplicaciones usen el área de la pantalla ocupada por la barra de aplicaciones. Las aplicaciones deben enviar siempre el mensaje ABM_REMOVE antes de destruir una barra de aplicaciones.

Tamaño y posición de la barra de aplicaciones

Las aplicaciones deben establecer el tamaño y la posición de las barras de aplicaciones para que no interfieran con ninguna otra barra de aplicaciones ni con la barra de tareas. Cada barra de aplicaciones debe estar anclada a un borde determinado de la pantalla, al cual se pueden anclar varias barras de aplicaciones. Sin embargo, si una barra de aplicaciones está anclada al mismo borde que la barra de tareas, el sistema garantiza que la barra de tareas esté siempre en el borde más externo.

Para establecer el tamaño y la posición de una barra de aplicaciones, la aplicación propone primero un borde de pantalla y un rectángulo delimitador para la barra de aplicaciones enviando el mensaje ABM_QUERYPOS. El sistema determina si cualquier parte del área de pantalla dentro del rectángulo propuesto se está usando en la barra de tareas u otra barra de aplicaciones, ajusta el rectángulo (si es necesario) y devuelve el rectángulo ajustado a la aplicación.

Luego, la aplicación envía el mensaje ABM_SETPOS para establecer el nuevo rectángulo delimitador de la barra de aplicaciones. De nuevo, el sistema puede ajustar el rectángulo antes de devolverlo a la aplicación. Por este motivo, la aplicación debe usar el rectángulo ajustado devuelto por ABM_SETPOS para establecer el tamaño y la posición finales. La aplicación puede usar la función MoveWindow para mover la barra de aplicaciones a la posición.

Mediante el uso de un proceso de dos pasos para establecer el tamaño y la posición, el sistema permite a la aplicación proporcionar comentarios intermedios al usuario durante la operación de movimiento. Por ejemplo, si el usuario arrastra una barra de aplicaciones, la aplicación puede mostrar un rectángulo sombreado que indica la nueva posición antes de que la barra de aplicaciones se mueva realmente.

Las aplicaciones deben establecer el tamaño y la posición de sus barras de aplicaciones después de registrarlas y cada vez que la barra de aplicaciones reciba el mensaje de notificación ABN_POSCHANGED. Las barras de aplicaciones reciben este mensaje de notificación cada vez que se produce un cambio en el estado de tamaño, posición o visibilidad de la barra de tareas y cada vez que se cambia de tamaño, se agrega o se quita otra barra de aplicaciones del mismo lado de la pantalla.

Cada vez que una barra de aplicaciones recibe el mensaje WM_ACTIVATE, esta debe enviar el mensaje ABM_ACTIVATE. Del mismo modo, cuando una barra de aplicaciones recibe el mensaje de WM_WINDOWPOSCHANGED, esta debe llamar a ABM_WINDOWPOSCHANGED. El envío de estos mensajes garantiza que el sistema establezca correctamente el orden z de las barras de aplicación de ocultación automática en el mismo borde.

Barras de herramientas de escritorio de aplicaciones de ocultación automática

Una barra de aplicaciones de ocultación automática es una barra que normalmente está oculta, pero que se hace visible cuando el usuario mueve el cursor del mouse hacia el borde de la pantalla al que está asociada la barra de aplicaciones. La barra de aplicaciones se oculta de nuevo cuando el usuario mueve el cursor del mouse fuera del rectángulo delimitador de la barra.

Aunque el sistema permite varias barras de aplicaciones diferentes en un momento dado, solo permite una barra de aplicaciones de ocultación automática a la vez para cada borde de la pantalla por orden de llegada. El sistema mantiene automáticamente el orden z de una barra de aplicaciones de ocultación automática (solo dentro de su grupo de orden z).

Para registrar o anular el registro de una barra de aplicaciones de ocultación automática, las aplicaciones usan el mensaje ABM_SETAUTOHIDEBAR. El mensaje especifica el borde de la barra de aplicaciones y una marca que establece si se va a registrar la barra de aplicaciones o si se va a anular su registro. Si se registra una barra de aplicaciones de ocultación automática, pero ya hay una asociada al borde especificado, se produce un error en el mensaje. Las aplicaciones pueden recuperar el identificador de la barra de aplicaciones de ocultación automática asociada a un borde enviando el mensaje ABM_GETAUTOHIDEBAR.

No es necesario registrar las barras de aplicaciones de ocultación automática como barras de aplicaciones normales, es decir, enviando el mensaje ABM_NEW. Una barra de aplicaciones que no esté registrada mediante ABM_NEW se superpone a las barras de aplicaciones ancladas en el mismo borde de la pantalla.

Mensajes de notificación de barra de aplicaciones

El sistema envía mensajes para notificar a las barras de aplicaciones los eventos que pueden afectar a su posición y apariencia. Los mensajes se envían en el contexto de un mensaje definido por la aplicación. La aplicación especifica el identificador del mensaje cuando envía el mensaje ABM_NEW para registrar la barra de aplicaciones. El código de notificación está en el parámetro wParam del mensaje definido por la aplicación.

Las barras de aplicaciones reciben el mensaje de notificación ABN_POSCHANGED cuando cambia el tamaño, la posición o el estado de visibilidad de la barra de tareas, cuando se agrega otra barra de aplicaciones al mismo borde de la pantalla, o cuando se cambia o quita otra barra de aplicaciones del mismo borde de la pantalla. Las barras de aplicaciones deben responder a este mensaje de notificación enviando los mensajes ABM_QUERYPOS y ABM_SETPOS. Si ha cambiado la posición de una barra de aplicaciones, esta debe llamar a la función MoveWindow para desplazarse a la nueva posición.

El sistema envía el mensaje de notificación ABN_STATECHANGE cada vez que cambia el estado de visibilidad de la barra de tareas (ocultar automáticamente o siempre visible), es decir, cuando el usuario selecciona o desactiva las casillas Siempre visible u Ocultar automáticamente en la hoja de propiedades de la barra de tareas. Las barras de aplicaciones puede usar este mensaje de notificación para establecer su estado de manera que se ajuste al de la barra de tareas, si así se desea.

Cuando se inicia una aplicación de pantalla completa o cuando se cierra la última aplicación de pantalla completa, la barra de aplicaciones recibe el mensaje de notificación ABN_FULLSCREENAPP. El parámetro lParam indica si la aplicación de pantalla completa se abre o se cierra. Si se abre, la barra de aplicaciones debe colocarse en la parte inferior del orden z. La barra de aplicaciones debe restaurar su posición de orden z cuando se haya cerrado la última aplicación de pantalla completa.

Las barras de aplicaciones reciben el mensaje de notificación ABN_WINDOWARRANGE cuando el usuario selecciona los comandos Cascada, Mosaico horizontal o Mosaico vertical en el menú contextual de la barra de tareas. El sistema envía el mensaje dos veces, antes de reorganizar las ventanas (lParam es TRUE) y después de organizar las ventanas (lParam es FALSE).

Las barras de aplicaciones pueden usar mensajes ABN_WINDOWARRANGE para excluirse de la operación de cascada o de mosaico. Para excluirse, las barras de aplicaciones deben ocultarse cuando lParam es TRUE y mostrarse cuando lParam es FALSE. Si una barra de aplicaciones se oculta en respuesta a este mensaje, no es necesario que envíe los mensajes ABM_QUERYPOS y ABM_SETPOS en respuesta a la operación de cascada o de mosaico.

Registro de una barra de herramientas de escritorio de aplicaciones

Las aplicaciones deben registrar las barras de aplicaciones enviando el mensaje ABM_NEW. Al registrar una barra de aplicaciones, esta se agrega a la lista interna del sistema y proporciona al sistema un identificador de mensaje que se usará para enviar mensajes de notificación a dicha barra de aplicaciones. Antes de salir, la aplicación debe anular el registro de la barra de aplicaciones enviando el mensaje ABM_REMOVE. Al anular el registro, se quita la barra de aplicaciones de la lista interna del sistema y se impide que la barra reciba mensajes de notificación de barra de aplicaciones.

La función del ejemplo siguiente registra una barra de aplicaciones o anula su registro según el valor de un parámetro de marca de tipo booleano.

// RegisterAccessBar - registers or unregisters an appbar. 
// Returns TRUE if successful, or FALSE otherwise. 

// hwndAccessBar - handle to the appbar 
// fRegister - register and unregister flag 

// Global variables 
//     g_uSide - screen edge (defaults to ABE_TOP) 
//     g_fAppRegistered - flag indicating whether the bar is registered 

BOOL RegisterAccessBar(HWND hwndAccessBar, BOOL fRegister) 
{ 
    APPBARDATA abd; 
    
    // An application-defined message identifier
    APPBAR_CALLBACK = (WM_USER + 0x01);
    
    // Specify the structure size and handle to the appbar. 
    abd.cbSize = sizeof(APPBARDATA); 
    abd.hWnd = hwndAccessBar; 

    if (fRegister) 
    { 
        // Provide an identifier for notification messages. 
        abd.uCallbackMessage = APPBAR_CALLBACK; 

        // Register the appbar. 
        if (!SHAppBarMessage(ABM_NEW, &abd)) 
            return FALSE; 

        g_uSide = ABE_TOP;       // default edge 
        g_fAppRegistered = TRUE; 

    } 
    else 
    { 
        // Unregister the appbar. 
        SHAppBarMessage(ABM_REMOVE, &abd); 
        g_fAppRegistered = FALSE; 
    } 

    return TRUE; 
}

Establecimiento del tamaño y la posición de la barra de aplicaciones

Las aplicaciones deben establecer el tamaño y la posición de las barras de aplicaciones después de registrarlas, después de que el usuario las mueva o cambie su tamaño y siempre que las barras de aplicaciones reciban el mensaje de notificación ABN_POSCHANGED. Antes de establecer el tamaño y la posición de la barra de aplicaciones, la aplicación envía el mensaje ABM_QUERYPOS para solicitar al sistema un rectángulo delimitador aprobado. El sistema devuelve un rectángulo delimitador que no interfiere con la barra de tareas ni con ninguna otra barra de aplicaciones. El sistema ajusta el rectángulo exclusivamente restando; no hace ningún esfuerzo por conservar el tamaño inicial del rectángulo. Por este motivo, la barra de aplicaciones debe reajustar el rectángulo, según sea necesario, después de enviar ABM_QUERYPOS.

Luego, la aplicación vuelve a pasar el rectángulo delimitador al sistema mediante el mensaje ABM_SETPOS. Después llama a la función MoveWindow para mover la barra de aplicaciones a la posición.

En el ejemplo siguiente se muestra cómo establecer el tamaño y la posición de una barra de aplicaciones.

// AppBarQuerySetPos - sets the size and position of an appbar. 

// uEdge - screen edge to which the appbar is to be anchored 
// lprc - current bounding rectangle of the appbar 
// pabd - address of the APPBARDATA structure with the hWnd and cbSize members filled

void PASCAL AppBarQuerySetPos(UINT uEdge, LPRECT lprc, PAPPBARDATA pabd) 
{ 
    int iHeight = 0; 
    int iWidth = 0; 

    pabd->rc = *lprc; 
    pabd->uEdge = uEdge; 

    // Copy the screen coordinates of the appbar's bounding 
    // rectangle into the APPBARDATA structure. 
    if ((uEdge == ABE_LEFT) || (uEdge == ABE_RIGHT)) 
    { 
        iWidth = pabd->rc.right - pabd->rc.left; 
        pabd->rc.top = 0; 
        pabd->rc.bottom = GetSystemMetrics(SM_CYSCREEN); 
    } 
    else 
    { 
        iHeight = pabd->rc.bottom - pabd->rc.top; 
        pabd->rc.left = 0; 
        pabd->rc.right = GetSystemMetrics(SM_CXSCREEN); 
    } 

    // Query the system for an approved size and position. 
    SHAppBarMessage(ABM_QUERYPOS, pabd); 

    // Adjust the rectangle, depending on the edge to which the appbar is anchored.
    switch (uEdge) 
    { 
        case ABE_LEFT: 
            pabd->rc.right = pabd->rc.left + iWidth; 
            break; 

        case ABE_RIGHT: 
            pabd->rc.left = pabd->rc.right - iWidth; 
            break; 

        case ABE_TOP: 
            pabd->rc.bottom = pabd->rc.top + iHeight; 
            break; 

        case ABE_BOTTOM: 
            pabd->rc.top = pabd->rc.bottom - iHeight; 
            break; 
    } 

    // Pass the final bounding rectangle to the system. 
    SHAppBarMessage(ABM_SETPOS, pabd); 

    // Move and size the appbar so that it conforms to the 
    // bounding rectangle passed to the system. 
    MoveWindow(pabd->hWnd, 
               pabd->rc.left, 
               pabd->rc.top, 
               pabd->rc.right - pabd->rc.left, 
               pabd->rc.bottom - pabd->rc.top, 
               TRUE); 

}

Procesamiento de mensajes de notificación de barra de aplicaciones

Las barras de aplicaciones reciben mensajes de notificación cuando cambia el estado de la barra de tareas, cuando se inicia una aplicación a pantalla completa (o se cierra la última) o cuando se produce un evento que puede afectar a su tamaño y posición. En el ejemplo siguiente se muestra cómo procesar los distintos mensajes de notificación.

// AppBarCallback - processes notification messages sent by the system. 

// hwndAccessBar - handle to the appbar 
// uNotifyMsg - identifier of the notification message 
// lParam - message parameter 

void AppBarCallback(HWND hwndAccessBar, UINT uNotifyMsg, 
    LPARAM lParam) 
{ 
    APPBARDATA abd; 
    UINT uState; 

    abd.cbSize = sizeof(abd); 
    abd.hWnd = hwndAccessBar; 

    switch (uNotifyMsg) 
    { 
        case ABN_STATECHANGE: 

            // Check to see if the taskbar's always-on-top state has changed
            // and, if it has, change the appbar's state accordingly.
            uState = SHAppBarMessage(ABM_GETSTATE, &abd); 

            SetWindowPos(hwndAccessBar, 
                         (ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM, 
                         0, 0, 0, 0, 
                         SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 

            break; 

        case ABN_FULLSCREENAPP: 

            // A full-screen application has started, or the last full-screen
            // application has closed. Set the appbar's z-order appropriately.
            if (lParam) 
            { 
                SetWindowPos(hwndAccessBar, 
                             (ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM, 
                             0, 0, 0, 0, 
                             SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 
            } 
            else 
            { 
                uState = SHAppBarMessage(ABM_GETSTATE, &abd); 

                if (uState & ABS_ALWAYSONTOP) 
                    SetWindowPos(hwndAccessBar, 
                                 HWND_TOPMOST, 
                                 0, 0, 0, 0, 
                                 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 
            } 

        case ABN_POSCHANGED: 

            // The taskbar or another appbar has changed its size or position.
            AppBarPosChanged(&abd); 
            break; 
    } 
}

La siguiente función ajusta el rectángulo delimitador de una barra de aplicaciones y luego llama a la función AppBarQuerySetPos definida por la aplicación (incluida en la sección anterior) para establecer el tamaño y la posición de la barra en consecuencia.

// AppBarPosChanged - adjusts the appbar's size and position. 

// pabd - address of an APPBARDATA structure that contains information 
//        used to adjust the size and position. 

void PASCAL AppBarPosChanged(PAPPBARDATA pabd) 
{ 
    RECT rc; 
    RECT rcWindow; 
    int iHeight; 
    int iWidth; 

    rc.top = 0; 
    rc.left = 0; 
    rc.right = GetSystemMetrics(SM_CXSCREEN); 
    rc.bottom = GetSystemMetrics(SM_CYSCREEN); 

    GetWindowRect(pabd->hWnd, &rcWindow); 

    iHeight = rcWindow.bottom - rcWindow.top; 
    iWidth = rcWindow.right - rcWindow.left; 

    switch (g_uSide) 
    { 
        case ABE_TOP: 
            rc.bottom = rc.top + iHeight; 
            break; 

        case ABE_BOTTOM: 
            rc.top = rc.bottom - iHeight; 
            break; 

        case ABE_LEFT: 
            rc.right = rc.left + iWidth; 
            break; 

        case ABE_RIGHT: 
            rc.left = rc.right - iWidth; 
            break; 
    } 

    AppBarQuerySetPos(g_uSide, &rc, pabd); 
}