Verwenden von Anwendungsdesktopsymbolleisten

Eine Anwendungsdesktopsymbolleiste (auch als Appeiste bezeichnet) ist ein Fenster, das der Windows-Taskleiste ähnelt. Sie ist an einem Rand des Bildschirms verankert und enthält in der Regel Schaltflächen, mit denen der Benutzer schnell auf andere Anwendungen und Fenster zugreifen kann. Das System verhindert, dass andere Anwendungen den von einer App-Leiste verwendeten Desktopbereich verwenden. Eine beliebige Anzahl von Appleisten kann jederzeit auf dem Desktop vorhanden sein.

Dieses Thema enthält folgende Abschnitte:

Informationen zu Anwendungsdesktopsymbolleisten

Windows stellt eine API bereit, mit der Sie die vom System bereitgestellten Appleistendienste nutzen können. Die Dienste sorgen dafür, dass anwendungsdefinierte Appleisten reibungslos miteinander und mit der Taskleiste funktionieren. Das System verwaltet Informationen zu jeder Appleiste und sendet die Appleistennachrichten, um sie über Ereignisse zu benachrichtigen, die sich auf ihre Größe, Position und Darstellung auswirken können.

Senden von Nachrichten

Eine Anwendung verwendet einen speziellen Satz von Nachrichten, die als Appleistenbenachrichtigunen bezeichnet werden, um eine Appleiste hinzuzufügen oder zu entfernen, die Größe und Position einer Appl,eiste festzulegen und Informationen über die Größe, Position und den Status der Taskleiste abzurufen. Zum Senden einer Appleistenbenachrichtigung muss eine Anwendung die Funktion SHAppBarMessage verwenden. Die Parameter der Funktion enthalten einen Benachrichtigungsbezeichner, z. B. ABM_NEW, und die Adresse einer APPBARDATA-Struktur. Die Strukturmitglieder enthalten Informationen, die das System zum Verarbeiten der angegebenen Nachricht benötigt.

Bei jeder bestimmten Appleiste verwendet das System einige Elemente der APPBARDATA-Struktur und ignoriert die anderen. Das System verwendet jedoch immer die Mitglieder cbSizeund hWnd, sodass eine Anwendung diese Mitglieder für jede Appleistenbenachrichtigung ausfüllen muss. Das Mitglied cbSize gibt die Größe der Struktur an, und das Mitglied hWnd ist das Handle für das Fenster der Appleiste.

Einige Benachrichtigungen auf der Appleiste fordern Informationen vom System an. Beim Verarbeiten dieser Benachrichtigungen kopiert das System die angeforderten Informationen in die APPBARDATA-Struktur.

Registrierung

Das System behält eine interne Liste der Appleisten bei und verwaltet Informationen zu jeder Leiste in der Liste. Das System verwendet die Informationen zum Verwalten von Appleisten, zum Ausführen von Diensten für sie und zum Senden von Benachrichtigungen.

Eine Anwendung muss eine Appleiste registrieren (d. h. sie der internen Liste hinzufügen), bevor sie Appleistendienste vom System empfangen kann. Um eine Appleiste zu registrieren, sendet eine Anwendung die Benachrichtigung ABM_NEW. Die zugehörige APPBARDATA-Struktur enthält das Handle für das Fenster der Appleiste und einen anwendungsdefinierte Benachrichtigungsbezeichner. Das System verwendet den Benachrichtigungsbezeichner, um Benachrichtigungen an die Fensterprozedur des Appleistenfensters zu senden. Weitere Informationen finden Sie unter Appbenachrichtigungen.

Eine Anwendung hebt die Registrierung einer Appleiste auf, indem sie die Benachrichtigung ABM_REMOVE sendet. Wenn Sie die Registrierung einer Appleiste aufheben, wird sie aus der internen Liste der Appleisten des Systems entfernt. Das System sendet keine Benachrichtigungen mehr an die Appleiste oder verhindert, dass andere Anwendungen den von der Appleiste verwendeten Bildschirmbereich verwenden. Eine Anwendung sollte immer ABM_REMOVE senden , bevor eine Appleiste zerstört wird.

Größe und Position der Appleiste

Eine Anwendung sollte die Größe und Position einer Appleiste so festlegen, dass sie keine anderen Appleisten oder die Taskleiste beeinträchtigt. Jede Appleiste muss an einem bestimmten Bildschirmrand verankert sein, und mehrere Appleisten können an einem Rand verankert werden. Wenn jedoch eine Appleiste an demselben Rand wie die Taskleiste verankert ist, stellt das System sicher, dass sich die Taskleiste immer am äußersten Rand befindet.

Um die Größe und Position einer Appleiste festzulegen, schlägt eine Anwendung zunächst ein Bildschirmrand- und Begrenzungsrechteck für die Appleiste vor, indem sie die Benachrichtigung ABM_QUERYPOS sendet. Das System bestimmt, ob ein Teil des Bildschirmbereichs innerhalb des vorgeschlagenen Rechtecks von der Taskleiste oder einer anderen Appleiste verwendet wird, das Rechteck (falls erforderlich) anpasst und das angepasste Rechteck an die Anwendung zurückgibt.

Als Nächstes sendet die Anwendung die Benachrichtigung ABM_SETPOS, um das neue umgebende Rechteck für die Appleiste festzulegen. Auch hier kann das System das Rechteck anpassen, bevor es an die Anwendung zurückgegeben wird. Aus diesem Grund sollte die Anwendung das von ABM_SETPOS zurückgegebene angepasste Rechteck verwenden, um die endgültige Größe und Position festzulegen. Die Anwendung kann die Funktion MoveWindow verwenden, um die Appleiste an die Position zu verschieben.

Mithilfe eines zweistufigen Prozesses zum Festlegen der Größe und Position ermöglicht das System der Anwendung, dem Benutzer während des Verschiebungsvorgangs Zwischenfeedback zu geben. Wenn der Benutzer beispielsweise eine Appleiste zieht, zeigt die Anwendung möglicherweise ein schattiertes Rechteck an, das die neue Position angibt, bevor die Appleiste tatsächlich verschoben wird.

Eine Anwendung sollte die Größe und Position der Appleiste nach der Registrierung festlegen und wann immer die Appleiste die Benachrichtigung ABN_POSCHANGED empfängt. Eine Appleiste empfängt diese Benachrichtigung, wenn eine Änderung in der Größe, Position oder Sichtbarkeit der Taskleiste erfolgt und wann immer eine andere Appleiste auf derselben Seite des Bildschirms die Größe ändert, hinzugefügt oder entfernt wird.

Wenn eine Appleiste die Benachrichtigung WM_ACTIVATE empfängt, sollte sie die Benachrichtigung ABM_ACTIVATE senden. Wenn eine Appleiste eine Benachrichtigung WM_WINDOWPOSCHANGED empfängt, muss sie auch ABM_WINDOWPOSCHANGED aufrufen. Durch das Senden dieser Benachrichtigungen wird sichergestellt, dass das System die Z-Reihenfolge aller automatischen Appleisten am gleichen Rand ordnungsgemäß festlegt.

Automatisches Einblenden von Anwendungsdesktopsymbolleisten

Eine Appleiste mit automatischem Ausblenden ist eine, die normalerweise ausgeblendet ist, aber sichtbar wird, wenn der Benutzer den Mauszeiger auf den Bildschirmrand verschiebt, dem die Appleiste zugeordnet ist. Die Appleiste blendet sich erneut aus, wenn der Benutzer den Mauszeiger aus dem umgebenden Rechteck der Leiste verschiebt.

Obwohl das System eine Reihe von unterschiedlichen Appleisten zu einem bestimmten Zeitpunkt zulässt, ermöglicht es jeweils nur eine automatische Appleiste für jeden Bildschirmrand. Das System verwaltet automatisch die Z-Reihenfolge einer automatischen Appleiste (nur innerhalb der Z-Reihenfolge-Gruppe).

Eine Anwendung verwendet die Benachrichtigung ABM_SETAUTOHIDEBAR zum Registrieren oder Aufheben der Registrierung einer Appleiste mit automatischem Ausblenden . Die Benachrichtigung gibt den Rand für die Appleiste und ein Flag an, das angibt, ob die Appleiste registriert oder nicht registriert werden soll. Die Meldung schlägt fehl, wenn eine Appleiste mit automatischem Ausblenden registriert wird, aber eine andere Leiste bereits dem angegebenen Rand zugeordnet ist. Eine Anwendung kann das Handle an die Appleiste mit automatischem Ausblenden abrufen, die einem Rand zugeordnet ist, indem die Benachrichtigung ABM_GETAUTOHIDEBAR gesendet wird.

Eine Appleiste mit automatischem Ausblenden muss nicht als normale Appleiste registriert werden. Das heißt, sie muss nicht registriert werden, indem die Benachrichtigung ABM_NEW gesendet wird. Eine Appleiste, die von ABM_NEW nicht registriert ist, überlappt alle Appleisten, die am gleichen Bildschirmrand verankert sind.

Appleisten-Benachrichtigungen

Das System sendet Benachrichtigungen, um eine Appleiste über Ereignisse zu benachrichtigen, die sich auf die Position und Darstellung auswirken können. Die Benachrichtigungen werden im Kontext einer anwendungsdefinierten Benachrichtigung gesendet. Die Anwendung gibt den Bezeichner der Benachrichtigung an, wenn sie die Benachrichtigung ABM_NEW sendet, um die Appleiste zu registrieren. Der Benachrichtigungscode befindet sich im Parameter wParam der anwendungsdefinierten Benachrichtigung.

Eine Appleiste empfängt die Benachrichtigung ABN_POSCHANGED, wenn sich die Größe, Position oder Sichtbarkeit der Taskleiste ändert, wenn eine andere Appleiste am gleichen Bildschirmrand hinzugefügt wird oder eine andere Appleiste am gleichen Rand des Bildschirms geändert oder entfernt wird. Eine Appleiste sollte auf diese Benachrichtigung reagieren, indem sie die Benachrichtigungen ABM_QUERYPOS und ABM_SETPOS sendet. Wenn sich die Position einer Appleiste geändert hat, sollte sie die Funktion MoveWindow aufrufen, um sich an die neue Position zu verschieben.

Das System sendet die Benachrichtigung ABN_STATECHANGE, wenn sich der Zustand „Automatisch Ausblenden“ oder „Immer im Vordergrund“ der Taskleiste geändert hat, d. h., wenn der Benutzer das Kontrollkästchen Immer im Vordergrund oder Automatisch Ausblenden auf dem Eigenschaftenblatt der Taskleiste aktiviert oder deaktiviert . Eine Appleiste kann diese Benachrichtigung verwenden, um den Zustand so festzulegen, dass er dem der Taskleiste entspricht, falls gewünscht.

Wenn eine Vollbildanwendung gestartet wird oder die letzte Vollbildanwendung geschlossen wird, empfängt eine Appleiste die Benachrichtigung ABN_FULLSCREENAPP. Der Parameter lParam gibt an, ob die Vollbildanwendung geöffnet oder geschlossen wird. Wenn sie geöffnet wird, muss die Appleiste am unteren Rand der Z-Reihenfolge ablegen. Die Appleiste sollte die Position der Z-Reihenfolge wiederherstellen, wenn die letzte Vollbildanwendung geschlossen wurde.

Eine App-Leiste empfängt die Benachrichtigung ABN_WINDOWARRANGE, wenn der Benutzer den Befehl „Überlappen“, „Untereinander“ oder „Nebeneinander“ aus dem Kontextmenü der Taskleiste auswählt. Das System sendet die Benachrichtigung zweimal – vor dem Neuanordnen der Fenster (lParam ist TRUE) und nach dem Anordnen der Fenster (lParam ist FALSE).

Eine Appleiste kann ABN_WINDOWARRANGE-Benachrichtigungen verwenden, um sich selbst vom Überlappungs- oder Anordnungsvorgang auszuschließen. Um sich selbst auszuschließen, sollte sich die Appleiste ausblenden, wenn lParamTRUE ist und sich anzeigen, wenn lParamFALSE ist. Wenn sich eine Appleiste als Reaktion auf diese Benachrichtigung ausblendet, muss sie keine Benachrichtigungen ABM_QUERYPOS und ABM_SETPOS Nachrichten nicht als Reaktion auf den Überlappungs- oder Anordnungsvorgang senden.

Registrieren einer Anwendungsdesktopsymbolleiste

Eine Anwendung muss eine Appleiste registrieren, indem sie die Benachrichtigung ABM_NEW sendet. Das Registrieren einer Appleiste fügt sie zur internen Liste des Systems hinzu und stellt dem System einen Benachrichtigungsbezeichner bereit, der zum Senden von Benachrichtigungen an die Appleiste verwendet werden kann. Vor dem Beenden muss eine Anwendung die Registrierung der Appleiste aufheben, indem sie die Benachrichtigung ABM_REMOVE sendet. Durch das Aufheben der Registrierung wird die Appleiste aus der internen Liste des Systems entfernt und verhindert, dass die Leiste App-Benachrichtigungen empfängt.

Die Funktion im folgenden Beispiel registriert oder hebt die Registrierung einer Appleiste abhängig vom Wert eines booleschen Flagparameters auf.

// 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; 
}

Festlegen der Größe und Position der Appleiste

Eine Anwendung sollte die Größe und Position einer Appleiste nach der Registrierung der Appleiste festlegen, nachdem der Benutzer die Appleiste verschoben oder in der Größe verändert hat und wann immer die Appleiste die Benachrichtigung ABN_POSCHANGED empfängt. Vor dem Festlegen der Größe und Position der Appleiste fragt die Anwendung das System nach einem genehmigten umgebenden Rechteck ab, indem die Benachrichtigung ABM_QUERYPOS gesendet wird. Das System gibt ein umgebendes Rechteck zurück, das die Taskleiste oder eine andere Appleiste nicht beeinträchtigt. Das System passt das Rechteck rein durch Rechteck-Subtraktion an; es bemüht sich nicht, die anfängliche Größe des Rechtecks beizubehalten. Aus diesem Grund sollte die Appleiste nach dem Senden von ABM_QUERYPOS das Rechteck nach Bedarf neu justieren.

Als Nächstes übergibt die Anwendung das umgebende Rechteck mithilfe der Benachrichtigung ABM_SETPOS an das System zurück. Anschließend wird die Funktion MoveWindow aufgerufen, um die Appleiste an die Position zu verschieben.

Das folgende Beispiel zeigt, wie die Größe und Position einer Appleiste festgelegt wird.

// 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); 

}

Verarbeiten von Benachrichtigungen über die App-Benachrichtigungen

Eine Appleiste empfängt eine Benachrichtigung, wenn sich der Status der Taskleiste ändert, wenn eine Vollbildanwendung gestartet wird (oder geschlossen wird), oder wenn ein Ereignis auftritt, das sich auf die Größe und Position der Appleiste auswirken kann. Das folgende Beispiel zeigt, wie die verschiedenen Benachrichtigungen verarbeitet werden.

// 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; 
    } 
}

Die folgende Funktion passt das umgebende Rechteck einer Appleiste an und ruft dann die anwendungsdefinierte AppBarQuerySetPos-Funktion (im vorherigen Abschnitt enthalten) auf, um die Größe und Position der Leiste entsprechend festzulegen.

// 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); 
}