Панель задач

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

Примечание

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

 

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

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

Панель задач включает в себя следующее:

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

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

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

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

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

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

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

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

Пользователь может щелкнуть панель задач правой кнопкой мыши, чтобы открыть контекстное меню. Контекстное меню содержит команды для каскадных окон, окон стека, параллельного отображения окон, отображения рабочего стола, запуска диспетчера задач и задания свойств панели задач. Контекстное меню также предоставляет возможность добавления или удаления набора панелей инструментов на панели задач. Вы можете добавить новые панели инструментов в это меню, зарегистрировав их в категории CATID_DeskBand. Дополнительные сведения см. в разделе Реализация объектов band. Обратите внимание, что в 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 папки Programs с помощью 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 Обозреватель 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, для 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; 
 }