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

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

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

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

Дополнительные сведения об использовании уведомлений и области уведомлений см. в разделах "Рекомендации по взаимодействию с пользователем 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

Панель задач

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