Уведомления и область уведомлений

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

Этот раздел состоит из следующих подразделов.

Рекомендации по уведомлениям и области уведомлений

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

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

Windows 7 позволяет пользователю по своему выбору подавлять все уведомления от приложения, поэтому вдумчивый дизайн и использование уведомлений будет склонять пользователя к тому, чтобы приложение продолжало отображать их. Уведомления являются прерыванием; убедиться, что они того стоят.

В Windows 7 введено понятие "тихое время". Тихое время определяется как первый час после первого входа нового пользователя в свою учетную запись или в первый раз после обновления операционной системы или чистой установки. Это время отведено, чтобы позволить пользователю изучить и ознакомиться с новой средой, не отвлекаясь на уведомления. В течение этого времени большинство уведомлений не должны отправляться или отображаться. Исключения включают обратную связь, которую пользователь ожидает увидеть в ответ на действия пользователя, например при подключении USB-устройства или печати документа. Особенности API, касающиеся спокойного времени, рассматриваются далее в этом разделе.

Создание и отображение уведомления

В остальных разделах этого раздела описана основная процедура отображения уведомления от приложения пользователю.

  1. Добавление значка уведомления
  2. Определение версии NOTIFYICONDATA
  3. Определение внешнего вида и содержимого уведомлений
  4. Проверка состояния пользователя
  5. Отображение уведомления
  6. Удаление значка

Добавление значка уведомления

Чтобы отобразить уведомление, в области уведомлений должен быть значок. В некоторых случаях, например Microsoft Communicator или уровень заряда батареи, этот значок уже будет присутствовать. Однако во многих других случаях значок добавляется в область уведомлений только до тех пор, пока это необходимо для отображения уведомления. В любом случае это выполняется с помощью функции Shell_NotifyIcon . Shell_NotifyIcon позволяет добавлять, изменять или удалять значок в области уведомлений.

область уведомлений, содержащая три значка

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

Примечание

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

 

Структура NOTIFYICONDATA , отправленная в вызове Shell_NotifyIcon , содержит сведения, указывающие значок области уведомлений и само уведомление. Ниже приведены элементы, относящиеся к самому значку области уведомлений, которые можно задать с помощью NOTIFYICONDATA.

  • Ресурс, из которого берется значок.
  • Уникальный идентификатор значка.
  • Стиль подсказки значка.
  • Состояние значка (скрытое, общее или оба) в области уведомлений.
  • Дескриптор окна приложения, связанного со значком.
  • Идентификатор сообщения обратного вызова, который позволяет значку передавать события, происходящие в ограничивающем прямоугольнике значка, и уведомление выноски со связанным окном приложения. Ограничивающий прямоугольник значка можно получить с помощью Shell_NotifyIconGetRect.

Каждый значок в области уведомлений можно определить двумя способами:

  • Идентификатор GUID, с помощью которого значок объявлен в реестре. Это предпочтительный метод в Windows 7 и более поздних версиях.
  • Дескриптор окна, связанного со значком области уведомлений, а также идентификатор значка, определяемого приложением. Этот метод используется в Windows Vista и более ранних версиях.

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

Значки области уведомлений должны учитывать высокий DPI. Приложение должно предоставить значок 16x16 пикселей и значок 32x32 в файле ресурсов, а затем использовать LoadIconMetric , чтобы убедиться, что правильный значок загружен и масштабирован соответствующим образом.

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

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

Значок можно добавить в область уведомлений без отображения уведомления, определив только члены NOTIFYICONDATA (описанные выше) и вызвав Shell_NotifyIcon , как показано ниже:

NOTIFYICONDATA nid = {};
// Do NOT set the NIF_INFO flag.
...                    
Shell_NotifyIcon(NIM_ADD, &nid);

Вы также можете добавить значок в область уведомлений и отобразить уведомление в одном вызове Shell_NotifyIcon. Для этого перейдите к инструкциям в этом разделе.

Определение версии NOTIFYICONDATA

По мере развития Windows структура NOTIFYICONDATA расширялась, включив в нее больше элементов для определения дополнительных функциональных возможностей. Константы используются для объявления версии NOTIFYICONDATA , используемой со значком области уведомлений, чтобы обеспечить обратную совместимость. Если нет веских причин, настоятельно рекомендуется использовать версию NOTIFYICON_VERSION_4, представленную в Windows Vista. Эта версия предоставляет все доступные функциональные возможности, включая предпочтительную возможность идентификации значка области уведомлений с помощью зарегистрированного GUID, превосходного механизма обратного вызова и улучшения специальных возможностей.

Задайте версию с помощью следующих вызовов:

NOTIFYICONDATA nid = {};
... 
nid.uVersion = NOTIFYICON_VERSION_4;
// Add the icon
Shell_NotifyIcon(NIM_ADD, &nid);
// Set the version
Shell_NotifyIcon(NIM_SETVERSION, &nid);

Обратите внимание, что этот вызов Shell_NotifyIcon не отображает уведомление.

Определение внешнего вида и содержимого уведомлений

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

Снимок экрана: всплывающее уведомление о низком энергопотреблении батареи

Структура NOTIFYICONDATA , отправленная в вызове Shell_NotifyIcon , содержит сведения, указывающие значок области уведомлений и сам выносок уведомления. Ниже приведены элементы, относящиеся к уведомлению, которые можно задать с помощью NOTIFYICONDATA.

  • Значок, отображаемый на всплывающем окне уведомления, который указывается типом уведомления. Можно указать размер значка, а также пользовательские значки.
  • Заголовок уведомления. Этот заголовок должен содержать не более 48 символов на английском языке (для локализации). Заголовок представляет собой первую строку уведомления и определяется с помощью размера, цвета и веса шрифта.
  • Текст для использования в тексте уведомления. Этот текст должен содержать не более 200 символов на английском языке (для локализации).
  • Следует ли отменить уведомление, если оно не может быть отображено немедленно.
  • Время ожидания для уведомления. Этот параметр игнорируется в системах Windows Vista и более поздних версий, а также используется параметр времени ожидания специальных возможностей для всей системы.
  • Указывает, должно ли уведомление соблюдать тихое время, задается с помощью флага NIIF_RESPECT_QUIET_TIME .

Примечание

Интерфейсы IUserNotification и IUserNotification2 являются оболочками модели COM для Shell_NotifyIcon. Однако в настоящее время они не предоставляют полную функциональность NOTIFYICON_VERSION_4, доступную через Shell_NotifyIcon напрямую, включая использование GUID для идентификации значка области уведомлений.

 

Проверка состояния пользователя

Система использует функцию SHQueryUserNotificationState, которая используется для проверка, находится ли пользователь в спокойное время, вдали от компьютера или в состоянии бесперебойной работы, например в режиме презентации. Будет ли система отображать ваше уведомление, зависит от этого состояния.

Примечание

Если приложение использует пользовательский метод уведомления, который не использует Shell_NotifyIcon, IUserNotification или IUserNotification2, оно всегда должно явно вызывать SHQueryUserNotificationState , чтобы определить, должен ли он отображать пользовательский интерфейс уведомлений в это время.

 

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

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

Отображение уведомления

После установки версии NOTIFYICONDATA и определения уведомления в структуре NOTIFYICONDATA вызовите Shell_NotifyIcon , чтобы отобразить значок.

  • Если значок области уведомлений отсутствует, вызовите Shell_NotifyIcon , чтобы добавить значок. Это можно сделать для временных и непереходных значков.

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_ADD, &nid);
    
  • Если значок области уведомлений уже присутствует, вызовите Shell_NotifyIcon , чтобы изменить значок.

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_MODIFY, &nid);
    

В следующем коде показан пример настройки данных NOTIFYICONDATA и их отправки через Shell_NotifyIcon. Обратите внимание, что в этом примере значок уведомления определяется с помощью GUID (предпочтительно в Windows 7).

// Declare NOTIFYICONDATA details. 
    // Error handling is omitted here for brevity. Do not omit it in your code.
    
    NOTIFYICONDATA nid = {};
    nid.cbSize = sizeof(nid);
    nid.hWnd = hWnd;
    nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID;
    
    // Note: This is an example GUID only and should not be used.
    // Normally, you should use a GUID-generating tool to provide the value to
    // assign to guidItem.
    static const GUID myGUID = 
    {0x23977b55, 0x10e0, 0x4041, {0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x69}};
    nid.guidItem = myGUID;
    
    // This text will be shown as the icon's tooltip.
    StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L"Test application");
    
    // Load the icon for high DPI.
    LoadIconMetric(hInst, MAKEINTRESOURCE(IDI_SMALL), LIM_SMALL, &(nid.hIcon));
    
    // Show the notification.
    Shell_NotifyIcon(NIM_ADD, &nid) ? S_OK : E_FAIL;

Удаление значка

Чтобы удалить значок ( например, если вы только временно добавили значок для трансляции уведомления), вызовите Shell_NotifyIcon, как показано ниже. В этом вызове требуется только минимальная структура NOTIFYICONDATA , которая идентифицирует значок.

NOTIFYICONDATA nid = {};
...                    
Shell_NotifyIcon(NIM_DELETE, &nid);

Примечание

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

 

Пример пакета SDK

Полный пример использования Shell_NotifyIcon см. в примере NotificationIcon в пакете sdk для Windows.

Shell_NotifyIcon

Shell_NotifyIconGetRect

NOTIFYICONDATA

SHQueryUserNotificationState

IUserNotification

IUserNotification2

Панель задач

Расширения панели задач