Udostępnij za pośrednictwem


Korzystanie z pasków narzędzi pulpitu aplikacji

Pasek narzędzi pulpitu aplikacji (nazywany również paskiem aplikacji) jest oknem podobnym do paska zadań systemu Windows. Jest on zakotwiczony na krawędzi ekranu i zazwyczaj zawiera przyciski, które zapewniają użytkownikowi szybki dostęp do innych aplikacji i okien. System uniemożliwia innym aplikacjom korzystanie z obszaru pulpitu używanego przez pasek aplikacji. Dowolna liczba pasków aplikacji może istnieć na pulpicie w danym momencie.

Ten temat zawiera następujące sekcje.

Informacje o paskach narzędzi aplikacji na pulpit

System Windows udostępnia interfejs API, który umożliwia korzystanie z usług paska aplikacji udostępnianych przez system. Usługi pomagają zapewnić bezproblemowe działanie pasków aplikacji zdefiniowanych przez aplikację ze sobą i paska zadań. System przechowuje informacje o każdym pasku aplikacji i wysyła komunikaty na pasku aplikacji, aby powiadomić ich o zdarzeniach, które mogą mieć wpływ na ich rozmiar, położenie i wygląd.

Wysyłanie wiadomości

Aplikacja używa specjalnego zestawu komunikatów, nazywanych komunikatami paska aplikacji, do dodawania lub usuwania paska aplikacji, ustawiania rozmiaru i położenia paska aplikacji oraz pobierania informacji o rozmiarze, położeniu i stanie paska zadań. Aby wysłać komunikat paska aplikacji, aplikacja musi użyć funkcji SHAppBarMessage. Parametry funkcji obejmują identyfikator komunikatu, taki jak ABM_NEW, oraz adres struktury APPBARDATA. Człony struktury zawierają informacje, które system musi przetworzyć, aby obsłużyć dany komunikat.

W przypadku dowolnego komunikatu paska aplikacji system używa niektórych członków struktury APPBARDATA i ignoruje inne. Jednak system zawsze używa członków cbSize i hWnd, więc aplikacja musi wypełnić te członki dla każdego komunikatu appbar. Element członkowski cbSize określa rozmiar struktury, a element członkowski hWnd jest dojściem do okna paska aplikacji.

Niektóre komunikaty paska aplikacji żądają informacji z systemu. Podczas przetwarzania tych komunikatów system kopiuje żądane informacje do struktury APPBARDATA.

Rejestracja

System przechowuje wewnętrzną listę pasków aplikacji i przechowuje informacje o każdym pasku na liście. System używa informacji do zarządzania paskami aplikacji, wykonywania dla nich usług i wysyłania ich komunikatów powiadomień.

Aplikacja musi zarejestrować pasek aplikacji (czyli dodać go do listy wewnętrznej), zanim będzie mogła odbierać usługi paska aplikacji z systemu. Aby zarejestrować pasek aplikacji, aplikacja wysyła komunikat ABM_NEW. Dołączona struktura APPBARDATA zawiera dojście do okna paska aplikacji i identyfikator komunikatu zdefiniowanego przez aplikację. System używa identyfikatora komunikatu do wysyłania komunikatów powiadomień do procedury okna okna paska aplikacji. Aby uzyskać więcej informacji, zobacz Appbar Notification Messages (Komunikaty powiadomień na pasku aplikacji).

Aplikacja wyrejestruje pasek aplikacji, wysyłając komunikat ABM_REMOVE. Wyrejestrowywanie paska aplikacji usuwa go z wewnętrznej listy pasków aplikacji systemu. System nie wysyła już komunikatów powiadomień do paska aplikacji lub uniemożliwia innym aplikacjom korzystanie z obszaru ekranu używanego przez pasek aplikacji. Aplikacja powinna zawsze wysyłać ABM_REMOVE przed zniszczeniem paska aplikacji.

Rozmiar i położenie paska aplikacji

Aplikacja powinna ustawić rozmiar i położenie paska aplikacji, aby nie zakłócała żadnych innych pasków aplikacji ani paska zadań. Każdy pasek aplikacji musi być zakotwiczony na określonej krawędzi ekranu, a wiele pasków aplikacji można zakotwiczyć na krawędzi. Jeśli jednak pasek aplikacji jest zakotwiczony na tej samej krawędzi co pasek zadań, system gwarantuje, że pasek zadań jest zawsze na najbardziej zewnętrznej krawędzi.

Aby ustawić rozmiar i położenie paska aplikacji, aplikacja proponuje najpierw krawędź ekranu i prostokąt ograniczający dla paska aplikacji, wysyłając komunikat ABM_QUERYPOS. System określa, czy jakakolwiek część obszaru ekranu w proponowanym prostokątze jest używana przez pasek zadań lub inny pasek aplikacji, dostosowuje prostokąt (w razie potrzeby) i zwraca skorygowany prostokąt do aplikacji.

Następnie aplikacja wysyła komunikat ABM_SETPOS, aby ustawić nowy prostokąt ograniczający dla paska aplikacyjnego. Ponownie system może dostosować prostokąt przed zwróceniem go do aplikacji. Z tego powodu aplikacja powinna użyć dostosowanego prostokąta zwróconego przez ABM_SETPOS, aby ustawić ostateczny rozmiar i położenie. Aplikacja może użyć funkcji MoveWindow, aby przenieść pasek aplikacji do pozycji.

Dzięki użyciu dwuetapowego procesu ustawiania rozmiaru i położenia system umożliwia aplikacji przekazywanie pośrednich opinii użytkownikowi podczas operacji przenoszenia. Jeśli na przykład użytkownik przeciągnie pasek aplikacji, aplikacja może wyświetlić zacieniony prostokąt wskazujący nową pozycję przed rzeczywistym przeniesieniem paska aplikacji.

Aplikacja powinna ustawić rozmiar i położenie paska aplikacji po jego zarejestrowaniu i za każdym razem, gdy pasek aplikacji otrzyma komunikat powiadomienia ABN_POSCHANGED. Pasek aplikacji otrzymuje ten komunikat powiadomienia za każdym razem, gdy nastąpi zmiana rozmiaru, położenia lub widoczności paska zadań, a za każdym razem, gdy inny pasek aplikacji po tej samej stronie ekranu zostanie zmieniony, dodany lub usunięty.

Za każdym razem, gdy pasek aplikacji odbierze komunikat WM_ACTIVATE, powinien wysłać komunikat ABM_ACTIVATE. Podobnie gdy pasek aplikacji odbiera komunikat WM_WINDOWPOSCHANGED, musi wywołać ABM_WINDOWPOSCHANGED. Wysłanie tych komunikatów gwarantuje, że system prawidłowo ustawia kolejność z wszystkich automatycznie ukrywanych pasków aplikacji na tej samej krawędzi.

Automatyczne ukrywanie pasków narzędzi pulpitu aplikacji

Automatycznie ukrywany pasek aplikacji jest taki, który jest zwykle ukryty, ale staje się widoczny, gdy użytkownik przenosi kursor myszy na krawędź ekranu, z którą jest skojarzony pasek aplikacji. Pasek aplikacji ukrywa się ponownie, gdy użytkownik przenosi kursor myszy poza obszar paska.

Chociaż system pozwala na wiele różnych pasków aplikacji w danym momencie, umożliwia tylko jeden pasek z funkcją automatycznego ukrywania dla każdej krawędzi ekranu, na zasadzie "kto pierwszy, ten lepszy". System automatycznie zarządza kolejnością wyświetlania autoukrywającego się paska aplikacji (tylko w ramach swojej grupy z-order).

Aplikacja używa komunikatu ABM_SETAUTOHIDEBAR do zarejestrowania lub wyrejestrowania paska aplikacji automatycznie ukrywanego. Komunikat określa krawędź paska aplikacji i flagę określającą, czy pasek aplikacji ma być zarejestrowany, czy wyrejestrowany. Komunikat się nie powiedzie, jeśli jest rejestrowany pasek aplikacji z automatycznym ukrywaniem, ale pasek ten jest już skojarzony z określoną krawędzią. Aplikacja może pobrać dojście do paska aplikacji automatycznie ukrywanego skojarzonego z krawędzią, wysyłając komunikat ABM_GETAUTOHIDEBAR.

Pasek aplikacji automatycznie ukrywany nie musi rejestrować się jako zwykły pasek aplikacji; oznacza to, że nie musi być zarejestrowany przez wysłanie komunikatu ABM_NEW. Pasek aplikacji, który nie jest zarejestrowany przez ABM_NEW nakłada się na wszystkie paski aplikacji zakotwiczone na tej samej krawędzi ekranu.

Komunikaty powiadomień na pasku aplikacji

System wysyła komunikaty, aby powiadomić pasek aplikacji o zdarzeniach, które mogą mieć wpływ na jego położenie i wygląd. Komunikaty są wysyłane w kontekście komunikatu zdefiniowanego przez aplikację. Aplikacja określa identyfikator komunikatu podczas wysyłania komunikatu ABM_NEW w celu zarejestrowania paska aplikacji. Kod powiadomienia znajduje się w parametrze wParam komunikatu zdefiniowanego przez aplikację.

Pasek aplikacji otrzymuje komunikat powiadomienia ABN_POSCHANGED, gdy zmienia się rozmiar, położenie lub stan widoczności paska zadań, gdy dodany zostaje inny pasek aplikacji na tę samą krawędź ekranu lub gdy inny pasek aplikacji na tej samej krawędzi ekranu jest zmieniany lub usuwany. Pasek aplikacji powinien odpowiadać na ten komunikat powiadomienia, wysyłając wiadomości ABM_QUERYPOS i ABM_SETPOS. Jeśli pozycja paska aplikacji uległa zmianie, powinna wywołać funkcję MoveWindow, aby przenieść się do nowej pozycji.

System wysyła komunikat powiadomienia ABN_STATECHANGE za każdym razem, gdy zmieni się stan autoukrywania lub zawsze na wierzchu paska zadań — czyli gdy użytkownik wybierze lub wyczyści pole wyboru Zawsze na wierzchu lub Automatycznie ukryj na karcie właściwości paska zadań. Pasek aplikacji może użyć tego komunikatu powiadomienia, aby w razie potrzeby ustawić jego stan zgodny z paskiem zadań.

Po uruchomieniu aplikacji pełnoekranowej lub zamknięciu ostatniej aplikacji pełnoekranowej pasek aplikacji otrzymuje komunikat powiadomienia ABN_FULLSCREENAPP. Parametr lParam wskazuje, czy aplikacja pełnoekranowa otwiera się, czy zamyka. Jeśli jest otwarty, pasek aplikacji musi znaleźć się na dole kolejności wyświetlania. Pasek aplikacji powinien przywrócić położenie na osi Z po zamknięciu ostatniej aplikacji pełnoekranowej.

Pasek aplikacji otrzymuje komunikat powiadomienia ABN_WINDOWARRANGE, gdy użytkownik wybierze polecenie Kaskada, Kafelek w poziomie lub Kafelek w pionie z menu skrótów paska zadań. System wysyła komunikat dwa razy — przed rozmieszczeniem okien (lParam jest true) i po uporządkowaniu okien (lParam jest FALSE).

Pasek aplikacji może używać komunikatów ABN_WINDOWARRANGE, aby wykluczyć się z operacji kaskadowej lub kafelkowania. Aby wykluczyć się, pasek aplikacji powinien ukrywać się, gdy lParam jest TRUE i pokazywać się, gdy lParam jest FALSE. Jeśli pasek aplikacji ukrywa się w odpowiedzi na ten komunikat, nie musi wysyłać komunikatów ABM_QUERYPOS i ABM_SETPOS w odpowiedzi na operację kaskadowania lub układania w kafelki.

Rejestrowanie paska narzędzi pulpitu aplikacji

Aplikacja musi zarejestrować pasek aplikacji, wysyłając komunikat ABM_NEW. Zarejestrowanie paska aplikacji dodaje go do wewnętrznej listy systemu i udostępnia systemowi identyfikator komunikatu do użycia do wysyłania komunikatów do paska aplikacji. Przed zamknięciem aplikacja musi wyrejestrować pasek aplikacji, wysyłając komunikat ABM_REMOVE. Wyrejestrowywanie usuwa pasek aplikacji z wewnętrznej listy systemu i uniemożliwia pasek odbierania komunikatów powiadomień na pasku aplikacji.

Funkcja w poniższym przykładzie rejestruje lub wyrejestrowuje pasek aplikacji w zależności od wartości parametru flagi logicznej.

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

Ustawianie rozmiaru i położenia paska aplikacji

Aplikacja powinna ustawić rozmiar i położenie paska aplikacji po zarejestrowaniu paska aplikacji, po przesunięciu lub zmienieniu jego rozmiaru przez użytkownika oraz za każdym razem, gdy pasek aplikacji otrzyma komunikat powiadomienia ABN_POSCHANGED. Przed ustawieniem rozmiaru i położenia paska narzędziowego, aplikacja odpytuje system w celu uzyskania zatwierdzonego prostokąta granicznego poprzez wysłanie komunikatu ABM_QUERYPOS. System zwraca prostokąt ograniczający, który nie zakłóca paska zadań ani żadnego innego paska narzędzi. System dostosowuje prostokąt wyłącznie przez odejmowanie; nie próbuje zachować początkowego rozmiaru prostokąta. Z tego powodu pasek aplikacji powinien dostosować prostokąt, w razie potrzeby, po wysłaniu ABM_QUERYPOS.

Następnie aplikacja przekazuje prostokąt ograniczenia z powrotem do systemu przy użyciu komunikatu ABM_SETPOS. Następnie wywołuje funkcję MoveWindow, aby przenieść pasek aplikacji do pozycji.

W poniższym przykładzie pokazano, jak ustawić rozmiar i położenie paska aplikacji.

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

}

Przetwarzanie komunikatów powiadomień paska aplikacji

Pasek aplikacji otrzymuje komunikat powiadomienia, gdy stan paska zadań zmieni się, gdy zostanie uruchomiona aplikacja pełnoekranowa (lub ostatnia zostanie zamknięta) lub gdy wystąpi zdarzenie, które może mieć wpływ na rozmiar i położenie paska aplikacji. W poniższym przykładzie pokazano, jak przetwarzać różne komunikaty powiadomień.

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

Poniższa funkcja dostosowuje prostokąt ograniczający paska, a następnie wywołuje funkcję AppBarQuerySetPos zdefiniowaną przez aplikację (zawartą w poprzedniej sekcji), aby odpowiednio ustawić rozmiar i położenie paska.

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