Utilisation des barres d’outils de Bureau d’application
Une barre d’outils de Bureau d’application(également appelée appbar) est une fenêtre similaire à la barre des tâches Windows. Elle est ancrée à l’un des bords de l’écran, et contient généralement des boutons qui permettent à l’utilisateur d’accéder rapidement à d’autres applications et fenêtres. Le système empêche les autres applications d’utiliser la zone de Bureau utilisée par une appbar. Il peut exister un nombre quelconque d’appbars sur le Bureau à tout moment.
Cette rubrique contient les sections suivantes.
- À propos des barres d’outils de Bureau d’application
- Inscription d’une barre d’outils de Bureau d’application
- Définition de la taille et de la position de l’appbar
- Traitement des messages de notification d’appbar
À propos des barres d’outils de Bureau d’application
Windows fournit une API qui vous permet de tirer parti des services d’appbar fournis par le système. Les services permettent de s’assurer que les appbars définies par une application interagissent correctement entre elles et avec la barre des tâches. Le système conserve des informations sur chaque appbar, et leur envoie des messages afin de les avertir des événements susceptibles d’affecter leur taille, leur position et leur apparence.
sending messages
Une application utilise un ensemble spécial de messages, appelé messages d’appbar, pour ajouter ou supprimer une appbar, définir la taille et la position d’une appbar, et récupérer des informations sur la taille, la position et l’état de la barre des tâches. Pour envoyer un message d’appbar, une application doit utiliser la fonction SHAppBarMessage. Les paramètres de la fonction incluent un identificateur de message, tel que ABM_NEW, et l’adresse d’une structure APPBARDATA. Les membres de la structure contiennent des informations dont le système a besoin pour traiter le message donné.
Pour tout message d’appbar, le système utilise certains membres de la structure APPBARDATA et ignore les autres. Toutefois, le système utilise toujours les membres cbSize et hWnd. Par conséquent, une application doit renseigner ces membres pour chaque message d’appbar. Le membre cbSize spécifie la taille de la structure, et le membre hWnd est le handle de la fenêtre de l’appbar.
Certains messages d’appbar demandent des informations au système. Lors du traitement de ces messages, le système copie les informations demandées dans la structure APPBARDATA.
Enregistrement
Le système conserve une liste interne d’appbars et tient à jour des informations sur chaque barre de la liste. Le système utilise ces informations pour gérer les appbars, délivrer des services pour elles, et leur envoyer des messages de notification.
Une application doit inscrire une appbar (autrement dit, l’ajouter à la liste interne) avant de pouvoir recevoir des services d’appbar à partir du système. Pour inscrire une appbar, une application envoie le message ABM_NEW. La structure APPBARDATA associée inclut le handle de la fenêtre de l’appbar et un identificateur de message défini par l’application. Le système utilise l’identificateur de message pour envoyer des messages de notification à la procédure de fenêtre de la fenêtre de l’appbar. Pour plus d’informations, consultez Messages de notification d’appbar.
Une application désinscrit une appbar en envoyant le message ABM_REMOVE. La désinscription d’une appbar entraîne sa suppression de la liste interne des appbars du système. Le système n’envoie plus de messages de notification à l’appbar, et n’empêche plus d’autres applications d’utiliser la zone d’écran utilisée par l’appbar. Une application doit toujours envoyer ABM_REMOVE avant de détruire une appbar.
Taille et position des appbars
Une application doit définir la taille et la position d’une appbar afin qu’elle n’interfère pas avec d’autres appbars ou avec la barre des tâches. Chaque appbar doit être ancrée à un bord particulier de l’écran, et plusieurs appbars peuvent être ancrées à un bord. Toutefois, si une appbar est ancrée au même bord que la barre des tâches, le système garantit que la barre des tâches est toujours sur le bord le plus externe.
Pour définir la taille et la position d’une appbar, une application propose d’abord un bord d’écran et un rectangle englobant pour l’appbar en envoyant le message ABM_QUERYPOS. Le système détermine si une partie de la zone d’écran dans le rectangle proposé est utilisée par la barre des tâches ou une autre appbar, ajuste le rectangle (si nécessaire), et retourne le rectangle ajusté à l’application.
Ensuite, l’application envoie le message ABM_SETPOS afin de définir le nouveau rectangle englobant pour l’appbar. Là encore, le système peut ajuster le rectangle avant de le retourner à l’application. Pour cette raison, l’application doit utiliser le rectangle ajusté retourné par ABM_SETPOS pour définir la taille et la position finales. L’application peut utiliser la fonction MoveWindow pour déplacer l’appbar jusqu’à sa position.
En utilisant un processus en deux étapes pour définir la taille et la position, le système permet à l’application de fournir des commentaires intermédiaires à l’utilisateur pendant l’opération de déplacement. Par exemple, si l’utilisateur fait glisser une appbar, l’application peut afficher un rectangle ombré indiquant la nouvelle position avant le déplacement de l’appbar.
Une application doit définir la taille et la position de son appbar après l’avoir inscrite et chaque fois que l’appbar reçoit le message de notification ABN_POSCHANGED. Une appbar reçoit ce message de notification chaque fois qu’un changement de taille, de position ou de visibilité de la barre des tâches se produit, et chaque fois qu’une autre appbar du même côté de l’écran est redimensionnée, ajoutée ou supprimée.
Chaque fois qu’une appbar reçoit le message WM_ACTIVATE, elle doit envoyer le message ABM_ACTIVATE. De même, lorsqu’une appbar reçoit un message WM_WINDOWPOSCHANGED, elle doit appeler ABM_WINDOWPOSCHANGED. L’envoi de ces messages garantit que le système définit correctement l’ordre z de toutes les appbars à masquage automatique qui se trouvent sur le même bord.
Masquer automatiquement les barres d’outils de Bureau d’application
Une appbar à masquage automatique est une appbar qui est normalement masquée, mais qui devient visible lorsque l’utilisateur déplace le curseur de la souris vers le bord de l’écran avec lequel l’appbar est associée. L’appbar redevient masquée lorsque l’utilisateur déplace le curseur de la souris hors du rectangle englobant de la barre.
Bien que le système autorise la présence d’un certain nombre d’appbars différentes à tout moment donné, il n’autorise qu’une seule appbar à masquage automatique à la fois pour chaque bord d’écran, et applique pour cela le principe du « premier arrivé, premier servi ». Le système gère automatiquement l’ordre z d’une appbar à masquage automatique (au sein de son groupe d’ordre z uniquement).
Une application utilise le message ABM_SETAUTOHIDEBAR pour inscrire ou désinscrire une appbar à masquage automatique. Le message spécifie le bord d’ancrage de l’appbar et un indicateur qui spécifie si l’appbar doit être inscrite ou désinscrite. Le message échoue si une appbar à masquage automatique est en cours d’inscription, mais qu’une autre appbar est déjà associée au bord spécifié. Une application peut récupérer le handle de l’appbar à masquage automatique associée à un bord en envoyant le message ABM_GETAUTOHIDEBAR.
Une appbar à masquage automatique n’a pas besoin de s’inscrire en tant qu’appbar normale ; autrement dit, elle n’a pas besoin d’être inscrite en envoyant le message ABM_NEW. Une appbar qui n’est pas inscrite par ABM_NEW chevauche toute appbar ancrée au même bord de l’écran.
Messages de notification d’appbar
Le système envoie des messages pour informer une appbar des événements susceptibles d’affecter sa position et son apparence. Les messages sont envoyés dans le contexte d’un message défini par l’application. L’application spécifie l’identificateur du message lorsqu’elle envoie le message ABM_NEW pour inscrire l’appbar. Le code de notification se trouve dans le paramètre wParam du message défini par l’application.
Une appbar reçoit le message de notification ABN_POSCHANGED lorsque la taille, la position ou l’état de visibilité de la barre des tâches change, lorsqu’une autre appbar est ajoutée au même bord de l’écran, ou lorsqu’une autre appbar sur le même bord de l’écran est redimensionnée ou supprimée. Une appbar doit répondre à ce message de notification en envoyant des messages ABM_QUERYPOS et ABM_SETPOS. Si la position d’une appbar a changé, elle doit appeler la fonction MoveWindow pour se déplacer vers la nouvelle position.
Le système envoie le message de notification ABN_STATECHANGE chaque fois que l’état « masquage automatique » ou « toujours visible » de la barre des tâches a changé, c’est-à-dire lorsque l’utilisateur coche ou décoche la case Toujours visible ou Masquer automatiquement sur la feuille de propriétés de la barre des tâches. Une appbar peut utiliser ce message de notification pour définir son état afin qu’il soit conforme à celui de la barre des tâches, si vous le souhaitez.
Lorsqu’une application en plein écran est démarrée ou lorsque la dernière application en plein écran est fermée, une appbar reçoit le message de notification ABN_FULLSCREENAPP. Le paramètre lParam indique si l’application en plein écran s’ouvre ou se ferme. Si elle s’ouvre, l’appbar doit descendre tout en bas de l’ordre z. L’appbar doit restaurer sa position dans l’ordre z lorsque la dernière application en plein écran a été fermée.
Une appbar reçoit le message de notification ABN_WINDOWARRANGE lorsque l’utilisateur sélectionne la commande En cascade, Mosaïque horizontale ou Mosaïque verticale dans le menu contextuel de la barre des tâches. Le système envoie le message deux fois : avant de réorganiser les fenêtres (lParam est TRUE) et après avoir organisé les fenêtres (lParam est FALSE).
Une appbar peut utiliser des messages ABN_WINDOWARRANGE pour s’exclure de l’opération de mise en cascade ou mosaïque. Pour s’exclure, l’appbar doit se masquer quand lParam est TRUE et s’afficher quand lParam est FALSE. Si une appbar se masque en réponse à ce message, elle n’a pas besoin d’envoyer les messages ABM_QUERYPOS et de ABM_SETPOS en réponse à l’opération de mise en cascade ou mosaïque.
Inscription d’une barre d’outils de Bureau d’application
Une application doit inscrire une appbar en envoyant le message ABM_NEW. L’inscription d’une appbar l’ajoute à la liste interne du système, et fournit à celui-ci un identificateur de message à utiliser pour envoyer des messages de notification à l’appbar. Avant de se fermer, une application doit désinscrire l’appbar en envoyant le message ABM_REMOVE. La désinscription supprime l’appbar de la liste interne du système, et empêche la barre de recevoir des messages de notification d’appbar.
La fonction de l’exemple suivant inscrit ou désinscrit une appbar, en fonction de la valeur d’un paramètre d’indicateur booléen.
// 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;
}
Définition de la taille et de la position de l’appbar
Une application doit définir la taille et la position d’une appbar après l’inscription de l’appbar, après que l’utilisateur a déplacé ou dimensionné l’appbar, et chaque fois que l’appbar reçoit le message de notification ABN_POSCHANGED. Avant de définir la taille et la position de l’appbar, l’application interroge le système pour obtenir un rectangle englobant approuvé en envoyant le message ABM_QUERYPOS. Le système retourne un rectangle englobant qui n’interfère pas avec la barre des tâches ni avec toute autre appbar. Le système ajuste le rectangle uniquement par soustraction de rectangle ; il ne s’efforce nullement de conserver la taille initiale du rectangle. Pour cette raison, l’appbar doit réajuster le rectangle, si nécessaire, après l’envoi de ABM_QUERYPOS.
Ensuite, l’application retransmet le rectangle englobant au système à l’aide du message ABM_SETPOS. Puis elle appelle la fonction MoveWindow pour déplacer l’appbar jusqu’à sa position.
L’exemple suivant montre comment définir la taille et la position d’une appbar.
// 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);
}
Traitement des messages de notification d’appbar
Une appbar reçoit un message de notification lorsque l’état de la barre des tâches change, lorsqu’une application en plein écran démarre (ou la dernière se ferme), ou lorsqu’un événement peut affecter la taille et la position de l’appbar. L’exemple suivant montre comment traiter les différents messages de notification.
// 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 fonction suivante ajuste le rectangle englobant d’une appbar, puis appelle la fonction AppBarQuerySetPos définie par l’application (incluse dans la section précédente) pour définir la taille et la position de la barre en conséquence.
// 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);
}