Compartir a través de


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 ha conocido históricamente como bandeja del sistema o área de estado.

Este tema contiene las siguientes secciones:

Directrices de Notificaciones y el área de notificación

Consulte las secciones Notificaciones y Área de notificación de las Directrices de interacción de la experiencia del usuario de Windows para conocer las prácticas recomendadas en el uso de las notificaciones y el área de notificación. El objetivo es beneficiar al usuario mediante un uso adecuado de las notificaciones, sin molestarle ni distraerle.

El área de notificación no es para información crítica sobre la que se deba 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 al usuario suprimir todas las notificaciones de una aplicación si así lo desea, por lo que un diseño y uso cuidadoso de las notificaciones alentará al usuario a permitir que su aplicación siga mostrándolas. Las notificaciones son una interrupción; asegúrese de que merecen la pena.

Windows 7 presenta el concepto de "quiet time". Quiet time 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. Este tiempo se reserva para permitirle 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. Entre las excepciones se 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 detalles de la API relacionados con el Quiet time.

Crear y mostrar una notificación

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

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

Agregar un icono de notificación

Para mostrar una notificación, debe tener un icono en el área de notificación. En determinados casos, como Microsoft Communicator o el nivel de batería, ese icono ya estará presente. Sin embargo, en muchos otros casos, usted añadirá un icono al área de notificación solo si fuese necesario para mostrar la notificación. En cualquier caso, esto se logra utilizando la función Shell_NotifyIcon. Shell_NotifyIcon permite añadir, modificar o eliminar un icono del área de notificación.

área de notificación con tres iconos

Cuando se añade 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 del á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 la sección de desbordamiento hasta el área de notificación, aunque en determinadas circunstancias el sistema puede promover temporalmente un icono al área de notificación como una vista previa corta (menos de un minuto).

Nota:

El usuario debe tener la última palabra sobre los iconos que quiere 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 se le debe dar la opción (normalmente a través de su menú contextual) de eliminar el icono del área de notificación.

 

La estructura NOTIFYICONDATA enviada en la llamada a Shell_NotifyIcon contiene información que especifica tanto el icono del área de notificación como 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.

  • El recurso desde el que se toma el icono.
  • Un identificador único para el icono.
  • El estilo de la descripción del icono.
  • El estado del icono (oculto, compartido o ambos) en el área de notificación.
  • El identificador de una ventana de la aplicación asociada al icono.
  • Un identificador de mensaje de devolución de llamada que permite al icono comunicar eventos que ocurren dentro del rectángulo delimitador del icono y la notificación de globo con la ventana de 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 una descripción. La descripción puede ser una descripción estándar (se prefiere) o una IU emergente dibujada por la aplicación. Aunque no es obligatoria una descripción, se recomienda.

Los iconos del área de notificación deben tener en cuenta los valores altos de DPI. Una aplicación debe proporcionar un icono de 16x16 píxeles y un icono de 32x32 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 gestionar un clic del ratón para ese icono. Cuando el usuario hace clic sobre el icono con el botón derecho del ratón, debería abrirse un menú contextual normal. Sin embargo, el resultado de un solo clic con el botón izquierdo del ratón variará con la función del icono. Debería 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 resultantes del clic deben colocarse cerca de la coordenada del clic en el área de notificación. Utilice CalculatePopupWindowPosition para determinar su ubicación.

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

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

También puede añadir 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.

Definir la versión NOTIFYICONDATA

Conforme Windows ha ido progresando, la estructura NOTIFYICONDATA se ha expandido para incluir más miembros para definir más funcionalidad. Las constantes se usan para declarar la versión de NOTIFYICONDATA que se usará con el icono del área de notificación, para permitir la compatibilidad con versiones anteriores. A menos que haya una razón convincente para hacerlo, se recomienda encarecidamente usar la versión NOTIFYICON_VERSION_4, introducida en Windows Vista. Esta versión proporciona toda la funcionalidad disponible, incluida la posibilidad preferida de identificar el icono del área de notificación mediante 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 las notificaciones

Una notificación es un tipo especial de control de información sobre herramientas en forma 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 del Panel de control, que permite al usuario mostrar u ocultar el icono o mostrar solo las notificaciones sin un icono.

captura de pantalla de una notificación en forma de globo que indica que el nivel de la batería es bajo

La estructura NOTIFYICONDATA enviada en la llamada a Shell_NotifyIcon contiene información que especifica tanto el icono del área de notificación como 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, que especifica el tipo de notificación. El tamaño del icono se puede especificar, así como personalizar los iconos.
  • Título de la 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 a través del tamaño de fuente, el color y el peso.
  • Texto a utilizar 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 se debe descartar la notificación si no se puede mostrar inmediatamente.
  • Tiempo de espera de la notificación. Esta configuración se omite en Windows Vista y los sistemas posteriores en favor de una configuración de tiempo de espera de accesibilidad de todo el sistema.
  • Si la notificación debe respetar el Quiet time, establézcalo a través del indicador NIIF_RESPECT_QUIET_TIME.

Nota:

Las interfaces IUserNotification y IUserNotification2 son contenedores de Component Object Model (COM) para Shell_NotifyIcon. Sin embargo, en este momento, no proporcionan toda la funcionalidad 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 Quiet time, no está en el ordenador o está en un estado ininterrumpible, como el Modo presentación. De este estado depende que el sistema muestre o no su notificación.

Nota:

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

 

Las notificaciones enviadas cuando el usuario está ausente se ponen en cola para su visualización, pero como usted no puede saber cuándo volverá el usuario o si la notificación seguirá siendo válida en ese momento, puede plantearse reenviar la notificación más tarde.

Las notificaciones enviadas durante el Quiet time se descartan sin mostrarse. Las directrices de diseño solicitan que se puedan ignorar todas las notificaciones. No deben requerir una acción inmediata por parte del usuario. Por lo tanto, ninguna notificación es tan importante como para interrumpir el Quiet time.

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 añadir el icono. Haga esto tanto para iconos transitorios como 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);
    

El código siguiente muestra un ejemplo de cómo configurar datos NOTIFYICONDATA y enviarlos 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;

Eliminar un icono

Para eliminar un icono (por ejemplo, cuando solo se ha añadido el icono temporalmente para difundir una notificación), llame a Shell_NotifyIcon como 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 del área de notificación puede seguir apareciéndole al usuario como opción en la página Iconos del área de notificación del Panel de control durante un máximo de siete días. Sin embargo, los cambios realizados no tendrán ningún efecto.

 

Ejemplo SDK

Consulte 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