Notificaciones y el área de notificación

El área de notificación es una parte de la barra de tareas que proporciona un origen temporal para las notificaciones y el estado. También se puede usar para mostrar iconos para las características del sistema y del programa que no tienen presencia en el escritorio, como el nivel de batería, el control de volumen y el estado de red. El área de notificación se conoce históricamente como la bandeja del sistema o el área de estado.

Este tema contiene las siguientes secciones:

Directrices de área de notificación y notificación

Consulta las secciones Notificaciones y área de notificación de las Directrices de interacción de la experiencia del usuario de Windows para conocer los procedimientos recomendados en el uso de notificaciones y el área de notificación. El objetivo es proporcionar la ventaja del usuario a través del uso adecuado de las notificaciones, sin ser molesto o distraído.

El área de notificación no es para información crítica que se debe actuar inmediatamente. Tampoco está pensado para el acceso rápido a programas o comandos. A partir de Windows 7, gran parte de esa funcionalidad se logra mejor a través del botón de la barra de tareas de una aplicación.

Windows 7 permite a un usuario suprimir todas las notificaciones de una aplicación si lo desean, por lo que el diseño de notificaciones y el uso cuidadosos inclinarán al usuario a permitir que la aplicación siga mostrándola. Las notificaciones son una interrupción; asegúrese de que vale la pena.

Windows 7 presenta el concepto de "tiempo tranquilo". El tiempo silencioso se define como la primera hora después de que un nuevo usuario inicie sesión en su cuenta por primera vez o por primera vez después de una actualización del sistema operativo o una instalación limpia. Esta vez se reserva para permitir al usuario explorar y familiarizarse con el nuevo entorno sin la distracción de las notificaciones. Durante este tiempo, la mayoría de las notificaciones no se deben enviar ni mostrar. Las excepciones incluyen comentarios que el usuario esperaría ver en respuesta a una acción del usuario, como cuando conecta un dispositivo USB o imprime un documento. Más adelante en este tema se describen los detalles de la API sobre el tiempo silencioso.

Crear y mostrar una notificación

En las secciones restantes de este tema se describe el procedimiento básico que se debe seguir para mostrar una notificación de la aplicación al usuario.

  1. Agregar un icono de notificación
  2. Definición de la versión NOTIFYICONDATA
  3. Definir el aspecto y el contenido de la notificación
  4. Comprobar el estado del usuario
  5. Mostrar la notificación
  6. Quitar un icono

Agregar un icono de notificación

Para mostrar una notificación, debe tener un icono en el área de notificación. En ciertos casos, como Microsoft Communicator o el nivel de batería, ese icono ya estará presente. Sin embargo, en muchos otros casos, agregará un icono al área de notificación solo siempre que sea necesario para mostrar la notificación. En cualquier caso, esto se logra mediante la función Shell_NotifyIcon . Shell_NotifyIcon permite agregar, modificar o eliminar un icono en el área de notificación.

área de notificación que contiene tres iconos

Cuando se agrega un icono al área de notificación en Windows 7, se agrega a la sección de desbordamiento del área de notificación de forma predeterminada. Este área contiene iconos de área de notificación que están activos, pero no visibles en el área de notificación. Solo el usuario puede promover un icono desde el desbordamiento hasta el área de notificación, aunque en determinadas circunstancias el sistema puede promover temporalmente un icono en el área de notificación como una vista previa corta (en menos de un minuto).

Nota

El usuario debe tener la última palabra sobre los iconos que quieren ver en su área de notificación. Antes de instalar un icono no transitorio en el área de notificación, se debe solicitar permiso al usuario. También deben tener la opción (normalmente, aunque su menú contextual) para quitar el icono del área de notificación.

 

La estructura NOTIFYICONDATA enviada en la llamada a Shell_NotifyIcon contiene información que especifica el icono del área de notificación y la propia notificación. A continuación se muestran los elementos específicos del icono del área de notificación que se pueden establecer a través de NOTIFYICONDATA.

  • Recurso desde el que se toma el icono.
  • Identificador único del icono.
  • Estilo de la información sobre herramientas del icono.
  • Estado del icono (oculto, compartido o ambos) en el área de notificación.
  • Identificador de una ventana de aplicación asociada al icono.
  • Identificador de mensaje de devolución de llamada que permite al icono comunicar eventos que se producen dentro del rectángulo delimitador del icono y la notificación de globo con la ventana de la aplicación asociada. El rectángulo delimitador del icono se puede recuperar a través de Shell_NotifyIconGetRect.

Cada icono del área de notificación se puede identificar de dos maneras:

  • GUID con el que se declara el icono en el registro. Este es el método preferido en Windows 7 y versiones posteriores.
  • Identificador de una ventana asociada al icono del área de notificación, además de un identificador de icono definido por la aplicación. Este método se usa en Windows Vista y versiones anteriores.

Los iconos del área de notificación pueden tener información sobre herramientas. La información sobre herramientas puede ser una información sobre herramientas estándar (preferida) o una interfaz de usuario emergente dibujada por la aplicación. Aunque no se requiere información sobre herramientas, se recomienda.

Los iconos del área de notificación deben ser compatibles con valores altos de PPP. Una aplicación debe proporcionar un icono de 16 x 16 píxeles y un icono de 32 x 32 en su archivo de recursos y, a continuación, usar LoadIconMetric para asegurarse de que el icono correcto se carga y se escala correctamente.

La aplicación responsable del icono del área de notificación debe controlar un clic del mouse para ese icono. Cuando un usuario hace clic con el botón derecho en el icono, debería abrir un menú contextual normal. Sin embargo, el resultado de un solo clic con el botón izquierdo del mouse variará con la función del icono. Debe mostrar lo que el usuario esperaría ver en el formato más adecuado para ese contenido: una ventana emergente, un cuadro de diálogo o la propia ventana del programa. Por ejemplo, podría mostrar el texto de estado de un icono de estado o un control deslizante para el control de volumen.

La ubicación de una ventana emergente o un cuadro de diálogo que se obtiene del clic se debe colocar cerca de la coordenada del clic en el área de notificación. Use CalculatePopupWindowPosition para determinar su ubicación.

El icono se puede agregar al área de notificación sin mostrar una notificación definiendo solo los miembros específicos del icono de NOTIFYICONDATA (descrito anteriormente) y llamando a Shell_NotifyIcon como se muestra aquí:

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

También puede agregar el icono al área de notificación y mostrar una notificación en una sola llamada a Shell_NotifyIcon. Para ello, continúe con las instrucciones de este tema.

Definición de la versión NOTIFYICONDATA

A medida que Windows ha progresado, la estructura NOTIFYICONDATA se ha ampliado para incluir más miembros para definir más funcionalidad. Las constantes se usan para declarar qué versión de NOTIFYICONDATA se usará con el icono del área de notificación, para permitir la compatibilidad con versiones anteriores. A menos que haya una razón atractiva para hacer lo contrario, se recomienda encarecidamente usar la versión de NOTIFYICON_VERSION_4, introducida en Windows Vista. Esta versión proporciona la funcionalidad completa disponible, incluida la capacidad preferida de identificar el icono del área de notificación a través de un GUID registrado, un mecanismo de devolución de llamada superior y una mejor accesibilidad.

Establezca la versión a través de las siguientes llamadas:

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

Tenga en cuenta que esta llamada a Shell_NotifyIcon no muestra una notificación.

Definir el aspecto y el contenido de la notificación

Una notificación es un tipo especial de control de información sobre herramientas de globo. Contiene un título, texto del cuerpo y un icono. Al igual que una ventana, tiene un botón Cerrar en su esquina superior derecha. También contiene un botón Opciones que abre el elemento Iconos del área de notificación en el Panel de control, que permite al usuario mostrar u ocultar el icono o mostrar solo las notificaciones sin un icono.

captura de pantalla del globo de notificación que indica que la energía de la batería es baja

La estructura NOTIFYICONDATA enviada en la llamada a Shell_NotifyIcon contiene información que especifica el icono del área de notificación y el propio globo de notificación. A continuación se muestran los elementos específicos de la notificación que se pueden establecer a través de NOTIFYICONDATA.

  • Icono que se va a mostrar en el globo de notificación, especificado por el tipo de notificación. El tamaño del icono se puede especificar, así como iconos personalizados.
  • Un título de notificación. Este título debe tener un máximo de 48 caracteres en inglés (para dar cabida a la localización). El título es la primera línea de la notificación y se separa mediante el uso del tamaño de fuente, el color y el peso.
  • Texto para su uso en el cuerpo de la notificación. Este texto debe tener un máximo de 200 caracteres en inglés (para dar cabida a la localización).
  • Si la notificación se debe descartar si no se puede mostrar inmediatamente.
  • Tiempo de espera de la notificación. Esta configuración se omite en Windows Vista y en sistemas posteriores en favor de una configuración de tiempo de espera de accesibilidad en todo el sistema.
  • Si la notificación debe respetar el tiempo silencioso, establezca a través de la marca NIIF_RESPECT_QUIET_TIME .

Nota

Las interfaces IUserNotification e IUserNotification2 son contenedores del Modelo de objetos componentes (COM) para Shell_NotifyIcon. Sin embargo, en este momento, no proporcionan toda la funcionalidad de NOTIFYICON_VERSION_4 disponible a través de Shell_NotifyIcon directamente, incluido el uso de un GUID para identificar el icono del área de notificación.

 

Comprobar el estado del usuario

El sistema usa la función SHQueryUserNotificationState para comprobar si el usuario está en tiempo silencioso, lejos del equipo o en un estado ininterrumpido, como el modo de presentación. Si el sistema muestra la notificación depende de este estado.

Nota

Si la aplicación usa un método de notificación personalizado que no usa Shell_NotifyIcon, IUserNotification o IUserNotification2, siempre debe llamar explícitamente a SHQueryUserNotificationState para determinar si debe mostrar la interfaz de usuario de notificación en ese momento.

 

Las notificaciones enviadas cuando el usuario está fuera de la pantalla se ponen en cola, pero porque no puede saber cuándo devolverá el usuario o si la notificación seguirá siendo válida en ese momento, podría considerar la posibilidad de volver a enviar la notificación más adelante.

Las notificaciones enviadas durante el tiempo silencioso se descartan sin mostrar. Las directrices de diseño piden que todas las notificaciones sean ignorables. No deben requerir una acción inmediata del usuario. Por lo tanto, ninguna notificación es tan importante que debe invalidar el tiempo silencioso.

Mostrar la notificación

Una vez que haya establecido la versión NOTIFYICONDATA y haya definido la notificación en una estructura NOTIFYICONDATA , llame a Shell_NotifyIcon para mostrar el icono.

  • Si el icono del área de notificación no está presente, llame a Shell_NotifyIcon para agregar el icono. Haga esto para los iconos transitorios y no transitorios.

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_ADD, &nid);
    
  • Si el icono del área de notificación ya está presente, llame a Shell_NotifyIcon para modificar el icono.

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

En el código siguiente se muestra un ejemplo de configuración de datos NOTIFYICONDATA y su envío a través de Shell_NotifyIcon. Tenga en cuenta que en este ejemplo se identifica el icono de notificación a través de un GUID (preferido en 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;

Quitar un icono

Para quitar un icono (por ejemplo, cuando solo se ha agregado el icono temporalmente para difundir una notificación), llame a Shell_NotifyIconcomo se muestra aquí. Solo se necesita una estructura NOTIFYICONDATA mínima que identifique el icono en esta llamada.

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

Nota

Cuando se desinstala una aplicación, su icono de área de notificación todavía puede aparecer al usuario como opción en la página Iconos de área de notificación de la Panel de control durante un máximo de siete días. Sin embargo, los cambios realizados no tendrán ningún efecto.

 

Ejemplo de SDK

Consulta el ejemplo notificationIcon en el Kit de desarrollo de software (SDK) de Windows para obtener un ejemplo completo del uso de Shell_NotifyIcon.

Shell_NotifyIcon

Shell_NotifyIconGetRect

NOTIFYICONDATA

SHQueryUserNotificationState

IUserNotification

IUserNotification2

Barra de tareas

Extensiones de la barra de tareas