Поделиться через


Панель задач

Интерфейс Windows включает специальную панель инструментов рабочего стола , называемую панелью задач. Панель задач можно использовать для таких задач, как переключение между открытыми окнами и запуск новых приложений.

Заметка

Сведения об изменениях, внесенных в панель задач, начиная с Windows 7, см. расширения панели задач.

 

В этом разделе содержатся следующие разделы.

Сведения о панели задач

На панели задач есть следующее:

  • меню 'Пуск'
  • Панель быстрого запуска (только Windows Vista и более ранние версии)
  • Кнопки панели задач
  • Панели инструментов (необязательно)
  • Область уведомлений

В меню "Пуск" содержатся команды, которые могут получать доступ к программам, документам и параметрам. Эти команды включают Все программы, Документы, Панель управления, Игры, Справка и поддержка, Завершение работыи Поиск программ и файлов.

Меню Пуск в более ранних версиях Windows содержало такие элементы, как Find и Run, функции которых были включены в Поиск программ и файлов в Windows Vista и более поздних версиях.

Панель быстрого запуска, доступная в версиях Windows ранее Windows 7, содержит сочетания клавиш для приложений. Windows предоставляет записи по умолчанию, такие как Windows Internet Explorer, и пользователь может добавить любые дополнительные сочетания клавиш, которые они выбирают. Значки в этой области отвечают на один щелчк. В Windows 7 и более поздних версиях эта функция включается в кнопки панели задач.

Система помещает кнопку на панель задач всякий раз, когда приложение создает неподчиненное окно, то есть окно, которое не имеет родительского элемента и обладает соответствующими битами расширенного стиля (см. раздел Управление кнопками панели задачниже). Чтобы переключиться в окно, пользователь нажимает кнопку окна. Эта функция была значительно расширена по сравнению с Windows 7. Дополнительные сведения см. в разделе Расширения панели задач.

Приложения могут помещать значки в область уведомлений, чтобы указать состояние операции или уведомить пользователя о событии. Например, приложение может поместить значок принтера в область уведомлений, чтобы показать, что задание печати выполняется. Однако в Windows 7 и более поздних версиях некоторые сведения, ранее предоставленные областью уведомлений, должны быть предоставлены с помощью кнопки панели задач приложения. Область уведомлений расположена в правом краю панели задач (если панель задач горизонтальная) или в нижней части (если панель задач вертикальная). Для получения дополнительных сведений см. разделы Уведомления иОбласть уведомлений.

Область уведомлений также отображает текущее время, если выбран этот параметр. Опция представлена как:

  • Windows 7 и более поздниеверсии: раскрывающийся список Часы на странице Включение и отключение системных значков приложения значки области уведомлений в Панели управления (также доступно через свойства области уведомлений).
  • Windows Vista: флажок для часов на странице области уведомлений окна свойств панели задач и меню "Пуск".
  • Windows XP: флажок "Показывать часы" в окне свойств панели задач и меню "Пуск".

Пользователь может щелкнуть правой кнопкой мыши панель задач, чтобы отобразить контекстное меню. Контекстное меню содержит команды для упорядочивания окон каскадом, упорядочивания окон стопкой, отображения окон рядом, показа рабочего стола, запуска диспетчера задач и настройки свойств панели задач. Контекстное меню также предоставляет возможность добавления или удаления набора панелей инструментов из панели задач. Вы можете добавить новые панели инструментов в это меню, зарегистрируя их в категории CATID_DeskBand. Дополнительные сведения см. в разделе Реализации объектов группы. Обратите внимание, что по состоянию на Windows 7 панель задач и область уведомлений имеют отдельные контекстные меню. Эти контекстные меню используют некоторые параметры, такие как расположение окон, и добавляют другие.

Параметры отображения панели задач

Панель задач поддерживает два варианта отображения: автоматическое скрытие и только в Windows Vista и более ранних версиях Always On Top (панель задач всегда находится в этом режиме в Windows 7 и более поздних версиях). Чтобы задать эти параметры, пользователь должен открыть контекстное меню панели задач, щелкните свойстваи установите или с нимите флажок "Автоматически скрыть панель задач" или флажок "Сохранить панель задач" в верхней части других окон. Чтобы получить состояние этих параметров отображения, используйте сообщение ABM_GETSTATE. Если вы хотите получать уведомления об изменении состояния этих параметров отображения, выполните обработку сообщения уведомления ABN_STATECHANGE в процедуре окна. Чтобы изменить состояние этих параметров отображения, используйте сообщение ABM_SETSTATE.

Область рабочей области — это часть экрана, не затмеченная панелью задач. Чтобы получить размер рабочей области, вызовите функцию SystemParametersInfo с набором значений SPI_GETWORKAREA. Чтобы получить координаты прямоугольника, описывающие расположение панели задач, используйте сообщение ABM_GETTASKBARPOS.

Можно скрыть панель задач, установив размер прямоугольника окна точно таким, как у экрана, с помощью SetWindowPos. Для систем Windows 2000 или более поздних версий окно должно либо не содержать WS_CAPTION или WS_THICKFRAME, либо быть такого размера, чтобы клиентская область охватывала весь экран. Кроме того, особенно для этих систем, если панель задач имеет значение Always On Top, она останется скрытой только в то время как приложение является приложением переднего плана.

Добавление сочетаний клавиш в меню "Пуск"

Чтобы добавить элемент в подменю программы в Microsoft Windows NT 4.0, Windows 2000 и более поздней версии или Windows 95 или более поздней версии, выполните следующие действия.

  1. Создайте ссылку оболочки с помощью интерфейсаIShellLink.
  2. Получите PIDL папки "Программы", используя SHGetSpecialFolderLocation, передав CSIDL_PROGRAMS.
  3. Добавьте ссылку шелла в папку "программы". Вы также можете создать папку в папке "Программы" и добавить ссылку в эту папку.

Управление кнопками панели задач

Оболочка создает кнопку на панели задач всякий раз, когда приложение создает окно, которое не закреплено за владельцем. Чтобы убедиться, что кнопка окна размещена на панели задач, создайте неуправляемое окно с расширенным стилем WS_EX_APPWINDOW. Чтобы предотвратить размещение кнопки окна на панели задач, создайте неуправляемое окно с расширенным стилем WS_EX_TOOLWINDOW. В качестве альтернативы можно создать скрытое окно и сделать это скрытое окно владельцем видимого окна.

Оболочка удаляет кнопку окна с панели задач только в том случае, если стиль окна поддерживает видимые кнопки панели задач. Если вы хотите динамически изменить стиль окна на один, который не поддерживает видимые кнопки панели задач, сначала необходимо скрыть окно (вызвав ShowWindow с SW_HIDE), изменить стиль окна и отобразить окно.

Кнопка окна обычно содержит значок приложения и заголовок. Однако если приложение не содержит системное меню, кнопка окна создается без значка.

Если вы хотите, чтобы приложение привлекло внимание пользователя, если окно неактивно, используйте функцию FlashWindow, чтобы сообщить пользователю, что сообщение ожидает. Эта функция заставляет мигать кнопку окна. Когда пользователь нажимает кнопку окна, чтобы активировать окно, приложение может отобразить сообщение.

Изменение содержимого панели задач

версии 4.71 и более поздних версий Shell32.dll добавляет возможность изменять содержимое панели задач. В приложении теперь можно добавлять, удалять и активировать кнопки панели задач. Активация элемента не активирует окно; в ней отображается элемент, нажатый на панели задач.

Возможности изменения панели задач реализуются в объекте COM (CLSID_TaskbarList), который предоставляет интерфейс ITaskbarList (IID_ITaskbarList). Чтобы инициализировать объект, необходимо вызвать метод ITaskbarList::HrInit. Затем можно использовать методы интерфейса ITaskbarList для изменения содержимого панели задач.

Добавление, изменение и удаление значков в области уведомлений

Используйте функцию Shell_NotifyIcon для добавления, изменения или удаления значков из области уведомлений. Параметр dwMessageShell_NotifyIcon представляет собой сообщение на панель задач, указывающую действие, которое необходимо выполнить. Параметр pnid — это указатель на структуру NOTIFYICONDATA, которая используется для идентификации значка и передачи дополнительных сведений, необходимых системе для обработки сообщения.

Вы можете выполнить следующие действия со значками области уведомлений.

  • Чтобы добавить значок в область уведомлений панели задач, вызовите Shell_NotifyIcon с параметром dwMessage, установленным в NIM_ADD. Структура NOTIFYICONDATA используется для указания дескриптора и идентификатора значка и любого текста подсказки. Если пользователь выбрал флажок Показать часы в свойствах панели задач, система помещает значок в непосредственное левое место часов. В противном случае значок отображается справа или в нижней части панели задач. Все существующие значки перемещаются влево, чтобы освободить место для нового значка.
  • Чтобы изменить данные значка, включая его дескриптор, текст подсказки и идентификатор сообщения обратного вызова, вызовите Shell_NotifyIcon с параметром dwMessage, установленным в значение NIM_MODIFY.
  • Чтобы удалить значок из области уведомлений, вызовите Shell_NotifyIcon с параметром dwMessage , равным NIM_DELETE.

Когда вы завершили операцию пользовательского интерфейса, верните фокус в область уведомлений, вызвав Shell_NotifyIcon и установив значение dwMessage в NIM_SETFOCUS. Например, это можно сделать, если значок панели задач отображает контекстное меню, но пользователь отменяет его, нажав клавишу ESCAPE.

Получение сообщений обратного вызова из области уведомлений

Приложения обычно помещают значки в область уведомлений панели задач, чтобы служить индикаторами состояния. Вы можете предоставить дополнительные сведения, когда пользователь выполняет действия мыши, например перемещение указателя мыши на значок или нажатие значка.

Система уведомляет вас о событиях мыши и клавиатуры, отправив определенное приложением сообщение обратного вызова, связанное с определенным значком. Таким образом, система может уведомить приложение, когда пользователь, например, щелкает значок или выбирает его, нажав клавишу.

При добавлении значка на панель задач определяется сообщение обратного вызова значка. Идентификатор сообщения обратного вызова указывается в uCallbackMessage элементе структуры NOTIFYICONDATA, переданной NIM_ADD. При возникновении события система отправляет сообщение обратного вызова в процедуру указанного окна элементом hWnd. Параметр wParam сообщения содержит идентификатор значка панели задач, в котором произошло событие. Параметр lParam содержит сообщение мыши или клавиатуры, связанное с событием. Например, когда указатель мыши перемещается на значок панели задач, lParam содержит WM_MOUSEMOVE.

Результаты различных событий мыши можно суммировать следующим образом:

  • Когда пользователь перемещает указатель мыши на значок, система отображает текст подсказки, указанный в NOTIFYICONDATA.
  • Когда пользователь щелкает значок, приложение получает уведомление WM_LBUTTONDOWN.
  • Когда пользователь щелкает значок правой кнопкой мыши, приложение получает уведомление WM_RBUTTONDOWN.
  • Когда пользователь дважды щелкает значок, приложение получает уведомление WM_LBUTTONDBLCLK.

Как правило, при щелчке по значку приложение отображает окно с дополнительными сведениями, при щелчке правой кнопкой мыши отображается контекстное меню, а при двойном щелчке выполняется команда контекстного меню по умолчанию.

Пример изменения текста подсказки, связанного со значком области уведомлений, см. в разделе Подсказки для значков панели состояния.

Версии 5.0 и более поздних версий оболочки обрабатывают Shell_NotifyIcon события мыши и клавиатуры по-разному, чем предыдущие версии оболочки, найденные в Windows NT 4.0, Windows 95 и Windows 98. Различия приведены следующим образом:

  • Если пользователь запрашивает контекстное меню значка уведомления с помощью клавиатуры, оболочка 5.0 отправляет связанное приложение WM_CONTEXTMENU сообщение. Более ранние версии отправляют сообщения WM_RBUTTONDOWN и WM_RBUTTONUP.
  • Если пользователь выбирает значок уведомления с помощью клавиатуры и активирует его клавишей пробела или ВВОДА, оболочка версии 5.0 отправляет связанное приложение NIN_KEYSELECT уведомление. Более ранние версии отправляют сообщения WM_RBUTTONDOWN и WM_RBUTTONUP.
  • Если пользователь выбирает значок уведомления с помощью мыши и активирует его с помощью клавиши ВВОД, оболочка версии 5.0 отправляет уведомление NIN_SELECT связанному приложению. Более ранние версии отправляют сообщения WM_RBUTTONDOWN и WM_RBUTTONUP.
  • Если пользователь наводит указатель мыши на значок, с которым связана всплывающая подсказка, оболочка версии 6.0 (Windows XP) отправляет следующие сообщения.
      • NIN_BALLOONSHOW — отправлено при отображении баллона (баллоны ставятся в очередь).
      • NIN_BALLOONHIDE — отправлено при исчезновении шара, например при удалении значка. Это сообщение не отправляется, если воздушный шар закрывается из-за времени ожидания или щелчка мыши.
      • NIN_BALLOONTIMEOUT - Отправлено, когда воздушный шар закрывается из-за истечения времени.
      • NIN_BALLOONUSERCLICK — отправлено при закрытии шара из-за щелчка мыши.

Можно выбрать способ поведения оболочки, вызвав Shell_NotifyIcon, установив dwMessage в NIM_SETVERSION. Задайте элемент uVersion структуры NOTIFYICONDATA, чтобы указать, требуется ли поведение версии 5.0 или предварительной версии 5.0.

Уведомление о создании панели задач

При использовании Microsoft Internet Explorer 4.0 и более поздних версий оболочка уведомляет приложения о создании панели задач. При создании панели задач он регистрирует сообщение со строкой TaskbarCreated, а затем передает это сообщение во все окна верхнего уровня. Когда приложение панели задач получает это сообщение, предполагается, что все добавленные значки панели задач были удалены и добавлены еще раз. Эта функция обычно применяется только к службам, которые уже запущены при запуске оболочки. В следующем примере показан очень упрощенный метод обработки этого дела.

В Windows 10 панель задач также передает это сообщение при изменении DPI основного отображения.

LRESULT CALLBACK WndProc(HWND hWnd, 
                         UINT uMessage, 
                         WPARAM wParam, 
                         LPARAM lParam)
{
    static UINT s_uTaskbarRestart;

    switch(uMessage)
    {
        case WM_CREATE:
            s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
            break;
        
        default:
            if(uMessage == s_uTaskbarRestart)
                AddTaskbarIcons();
            break;
    }

    return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

Использование панели задач

В этом разделе приведены примеры, демонстрирующие добавление значков в область уведомлений панели задач и обработку сообщений обратного вызова для значков панели задач.

Добавление и удаление значков панели задач в области уведомлений

Вы добавляете значок в область уведомлений панели задач, заполнив структуру NOTIFYICONDATA, а затем передаете структуру в Shell_NotifyIcon с параметром dwMessage, установленным на NIM_ADD. Члены структуры должны указать дескриптор окна, которое добавляет значок, а также идентификатор значка и дескриптор значка. Вы также можете указать текст подсказки для значка. Если нужно получать сообщения мыши для значка, укажите идентификатор сообщения обратного вызова, который система должна использовать для отправки сообщения в процедуру окна.

Функция в следующем примере демонстрирует добавление значка на панель задач.

// MyTaskBarAddIcon - adds an icon to the notification area. 
// Returns TRUE if successful, or FALSE otherwise. 
// hwnd - handle to the window to receive callback messages 
// uID - identifier of the icon 
// hicon - handle to the icon to add 
// lpszTip - tooltip text 

BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip) 
{ 
    BOOL res; 
    NOTIFYICONDATA tnid; 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 
    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = MYWM_NOTIFYICON; 
    tnid.hIcon = hicon; 
    if (lpszTip) 
        hr = StringCbCopyN(tnid.szTip, sizeof(tnid.szTip), lpszTip, 
                           sizeof(tnid.szTip));
        // TODO: Add error handling for the HRESULT.
    else 
        tnid.szTip[0] = (TCHAR)'\0'; 
 
    res = Shell_NotifyIcon(NIM_ADD, &tnid); 
 
    if (hicon) 
        DestroyIcon(hicon); 
 
    return res; 
}

Чтобы удалить значок из области уведомлений панели задач, заполните структуру NOTIFYICONDATA и вызовите Shell_NotifyIcon с dwMessage dwMessage, для параметра NIM_DELETE. При удалении значка с панели задач укажите только члены структуры cbSize, hWndи uID. Например:

// MyTaskBarDeleteIcon - deletes an icon from the notification area. 
// Returns TRUE if successful, or FALSE otherwise. 
// hwnd - handle to the window that added the icon. 
// uID - identifier of the icon to delete. 

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) 
{ 
    BOOL res; 
    NOTIFYICONDATA tnid; 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 
         
    res = Shell_NotifyIcon(NIM_DELETE, &tnid); 
    return res; 
}

Получение событий мыши

Если вы указываете сообщение обратного вызова для значка панели задач, система отправляет сообщение приложению всякий раз, когда событие мыши происходит в ограничивающем прямоугольнике значка. Параметр wParam сообщения указывает идентификатор значка панели задач, а параметр lParam сообщения указывает сообщение, созданное системой в результате события мыши.

Функция в следующем примере — это приложение, которое добавляет значки батареи и принтера на панель задач. Приложение вызывает функцию при получении сообщения обратного вызова. Функция определяет, щелкнул ли пользователь один из значков и, если произошел щелчок, вызывает определяемую приложением функцию для отображения сведений о состоянии.

// On_MYWM_NOTIFYICON - processes callback messages for taskbar icons. 
// wParam - first message parameter of the callback message. 
// lParam - second message parameter of the callback message. 

void On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam) 
{ 
    UINT uID; 
    UINT uMouseMsg; 
 
    uID = (UINT) wParam; 
    uMouseMsg = (UINT) lParam; 
 
    if (uMouseMsg == WM_LBUTTONDOWN) 
    { 
        switch (uID) 
        { 
            case IDI_MYBATTERYICON: 
 
                // The user clicked the battery icon. Display the 
                // battery status. 
                ShowBatteryStatus(); 
                break; 
 
            case IDI_MYPRINTERICON: 
 
                // The user clicked the printer icon. Display the 
                // status of the print job. 
                ShowJobStatus(); 
                break; 
 
            default: 
                break; 
        } 
     } 

     return; 
 }