Uso de barras de herramientas de escritorio de aplicaciones

Una barra de herramientas de escritorio de la aplicación (también denominada barra de aplicaciones) es una ventana similar a la Windows barra de tareas. Está anclado 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 utilizada por una barra de aplicaciones. Cualquier número de barras de aplicaciones puede existir en el escritorio 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 le permite aprovechar los servicios de la barra de aplicaciones proporcionados por el sistema. Los servicios ayudan a garantizar que las barras de aplicaciones definidas por la aplicación funcionen sin problemas entre sí y con la barra de tareas. El sistema mantiene información sobre cada barra de aplicaciones y envía los mensajes de las barras de aplicaciones para notificarlos sobre los eventos que pueden afectar a su tamaño, posición y apariencia.

enviar mensajes

Una aplicación usa un conjunto especial de mensajes, denominados mensajes de la barra de aplicaciones, para agregar o quitar una barra de aplicaciones, establecer el tamaño y la posición de una barra de aplicaciones, y recuperar información sobre el tamaño, la posición y el estado de la barra de tareas. Para enviar un mensaje de la barra de aplicaciones, una aplicación debe usar la función SHAppBarMessage . Los parámetros de la función incluyen un identificador de 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 la barra de aplicaciones determinado, el sistema usa algunos miembros de la estructura APPBARDATA y omite los demás. Sin embargo, el sistema siempre usa los miembros cbSize y hWnd , por lo que una aplicación debe rellenar estos miembros para cada mensaje de la barra de aplicaciones. El miembro cbSize especifica el tamaño de la estructura y el miembro hWnd es el identificador de la ventana de la barra de aplicaciones.

Algunos mensajes de la 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 y mantiene información sobre cada barra de la lista. El sistema usa la información para administrar las barras de aplicaciones, realizar servicios para ellos y enviarles mensajes de notificación.

Una aplicación debe registrar una barra de aplicaciones (es decir, agregarla a la lista interna) para poder recibir servicios de la barra de aplicaciones del sistema. Para registrar una barra de aplicaciones, una aplicación envía el mensaje ABM_NEW . La estructura APPBARDATA adjunta 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 la barra de aplicaciones.

Una aplicación anula el registro de una barra de aplicaciones mediante el envío del mensaje ABM_REMOVE . Al anular el registro de una barra de aplicaciones, 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 o impide que otras aplicaciones usen el área de pantalla usada por la barra de aplicaciones. Una aplicación siempre debe enviar ABM_REMOVE antes de destruir una barra de aplicaciones.

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

Una aplicación debe establecer el tamaño y la posición de una barra de aplicaciones para que no interfiera 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 y se pueden anclar varias barras de aplicaciones a un borde. 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, una aplicación propone primero un borde de pantalla y un rectángulo delimitador para la barra de aplicaciones enviando el mensaje de ABM_QUERYPOS . El sistema determina si cualquier parte del área de pantalla dentro del rectángulo propuesto se usa 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.

A continuación, la aplicación envía el mensaje ABM_SETPOS para establecer el nuevo rectángulo de límite para 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 traslado. Por ejemplo, si el usuario arrastra una barra de aplicaciones, la aplicación podría mostrar un rectángulo sombreado que indica la nueva posición antes de que la barra de aplicaciones se mueva realmente.

Una aplicación debe establecer el tamaño y la posición de su barra de aplicaciones después de registrarla y cada vez que la barra de aplicaciones recibe el mensaje de notificación ABN_POSCHANGED . Una barra de aplicaciones recibe 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 el tamaño, se agrega o se quita otra barra de aplicaciones en el mismo lado de la pantalla.

Cada vez que una barra de aplicaciones recibe el mensaje WM_ACTIVATE, debe enviar el mensaje ABM_ACTIVATE . De forma similar, cuando una barra de aplicaciones recibe un mensaje de WM_WINDOWPOSCHANGED, debe llamar a ABM_WINDOWPOSCHANGED. El envío de estos mensajes garantiza que el sistema establezca correctamente el orden z de las barras de aplicaciones de autohide en el mismo borde.

Barras de herramientas de escritorio de aplicaciones automáticas

Una barra de aplicaciones de autohide es una que normalmente está oculta, pero que se vuelve visible cuando el usuario mueve el cursor del mouse al borde de la pantalla con la 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 una serie de barras de aplicaciones diferentes en un momento dado, solo permite una barra de aplicaciones de autohide a la vez para cada borde de pantalla en primer lugar, primero servido. El sistema mantiene automáticamente el orden z de una barra de aplicaciones de autohide (solo dentro de su grupo de orden z).

Una aplicación usa el mensaje ABM_SETAUTOHIDEBAR para registrar o anular el registro de una barra de aplicaciones de autohide. El mensaje especifica el borde de la barra de aplicaciones y una marca que especifica si la barra de aplicaciones se va a registrar o anular el registro. Se produce un error en el mensaje si se está registrando una barra de aplicaciones de autohide, pero ya está asociada con el borde especificado. Una aplicación puede recuperar el identificador de la barra de aplicaciones de autohide asociada a un borde enviando el mensaje ABM_GETAUTOHIDEBAR .

Una barra de aplicaciones de autohide no necesita registrarse como una barra de aplicaciones normal; es decir, no es necesario registrarlo enviando el mensaje ABM_NEW . Una barra de aplicaciones que no está registrada por ABM_NEW se superpone a ninguna barra de aplicaciones anclada en el mismo borde de la pantalla.

Mensajes de notificación de la barra de aplicaciones

El sistema envía mensajes para notificar a una barra 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.

Una barra de aplicaciones recibe 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 el tamaño o se quita otra barra de aplicaciones en el mismo borde de la pantalla. Una barra de aplicaciones debe responder a este mensaje de notificación enviando ABM_QUERYPOS y ABM_SETPOS mensajes. Si ha cambiado la posición de una barra de aplicaciones, debe llamar a la función MoveWindow para moverse a la nueva posición.

El sistema envía el mensaje de notificación de ABN_STATECHANGE cada vez que el estado de autohide o always-on-top de la barra de tareas haya cambiado, es decir, cuando el usuario activa o desactiva la casilla Siempre en la parte superior o Ocultar automáticamente en la hoja de propiedades de la barra de tareas. Una barra de aplicaciones puede usar este mensaje de notificación para establecer su estado para que se ajuste a la de la barra de tareas, si lo desea.

Cuando se inicia una aplicación de pantalla completa o cuando se cierra la última aplicación de pantalla completa, una barra de aplicaciones recibe el mensaje de notificación ABN_FULLSCREENAPP . El parámetro lParam indica si la aplicación de pantalla completa está abriendo o cerrando. 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.

Una barra de aplicaciones recibe el mensaje de notificación ABN_WINDOWARRANGE cuando el usuario selecciona el comando Cascade, Tile Horizontally o Tile Vertically del 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).

Una barra de aplicaciones puede usar ABN_WINDOWARRANGE mensajes para excluirse de la operación en cascada o icono. Para excluirse, la barra de aplicaciones debe 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 enviar el ABM_QUERYPOS y ABM_SETPOS mensajes en respuesta a la operación en cascada o icono.

Registrar una barra de herramientas de escritorio de aplicaciones

Una aplicación debe registrar una barra de aplicaciones enviando el mensaje ABM_NEW . El registro de una barra de aplicaciones lo 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 la barra de aplicaciones. Antes de salir, una 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 la barra de aplicaciones.

La función del ejemplo siguiente registra o anula el registro de una barra de aplicaciones, según el valor de un parámetro de marca 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; 
}

Establecer el tamaño y la posición de la barra de aplicaciones

Una aplicación debe establecer el tamaño y la posición de una barra de aplicaciones después de registrar la barra de aplicaciones, después de que el usuario mueva o cambie el tamaño de la barra de aplicaciones y cada vez que la barra de aplicaciones reciba el mensaje de notificación de ABN_POSCHANGED . Antes de establecer el tamaño y la posición de la barra de aplicaciones, la aplicación consulta al sistema para ver un rectángulo de límite aprobado mediante el envío del mensaje ABM_QUERYPOS . 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 por resta de rectángulo; no hace ningún esfuerzo para 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.

A continuación, la aplicación vuelve a pasar el rectángulo delimitador al sistema mediante el mensaje ABM_SETPOS . A continuación, 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 la barra de aplicaciones

Una barra de aplicaciones recibe un mensaje de notificación cuando cambia el estado de la barra de tareas, cuando se inicia una aplicación de pantalla completa (o la última cierra), o cuando se produce un evento que puede afectar al tamaño y la posición de la barra de aplicaciones. 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, a continuación, 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); 
}