Notificações e a Área de Notificação

A área de notificação é uma parte da barra de tarefas que fornece uma fonte temporária para notificações e status. Ele também pode ser usado para exibir ícones para recursos do sistema e do programa que não têm presença na área de trabalho, como nível de bateria, controle de volume e status de rede. A área de notificação é conhecida historicamente como a bandeja do sistema ou status área.

Este tópico contém as seguintes seções:

Diretrizes da área de notificação e notificação

Consulte as seções Notificações e Área de Notificação das Diretrizes de Interação da Experiência do Usuário do Windows para obter práticas recomendadas no uso de notificações e na área de notificação. A meta é fornecer benefícios ao usuário por meio do uso apropriado de notificações, sem ser irritante ou perturbador.

A área de notificação não é para informações críticas que devem ser acionadas imediatamente. Ele também não se destina ao programa rápido ou ao acesso de comando. A partir do Windows 7, grande parte dessa funcionalidade é melhor realizada por meio do botão de barra de tarefas de um aplicativo.

O Windows 7 permite que um usuário suprima todas as notificações de um aplicativo se escolher, portanto, o design e o uso de notificação cuidadosos inclinarão o usuário a permitir que seu aplicativo continue a exibi-las. As notificações são uma interrupção; certifique-se de que eles valem a pena.

O Windows 7 apresenta o conceito de "tempo de silêncio". O tempo de silêncio é definido como a primeira hora depois que um novo usuário faz logon em sua conta pela primeira vez ou pela primeira vez após uma atualização do sistema operacional ou limpo instalação. Esse tempo é reservado para permitir que o usuário explore e se familiarize com o novo ambiente sem a distração das notificações. Durante esse tempo, a maioria das notificações não deve ser enviada ou mostrada. As exceções incluem comentários que o usuário esperaria ver em resposta a uma ação do usuário, como quando ele conecta um dispositivo USB ou imprime um documento. As especificidades da API sobre o tempo de silêncio são discutidas posteriormente neste tópico.

Criando e exibindo uma notificação

As seções restantes neste tópico descrevem o procedimento básico a seguir para exibir uma notificação do aplicativo para o usuário.

  1. Adicionar um ícone de notificação
  2. Definir a versão NOTIFYICONDATA
  3. Definir a Aparência e o Conteúdo da Notificação
  4. Verificar o Status do Usuário
  5. Exibir a notificação
  6. Removendo um ícone

Adicionar um ícone de notificação

Para exibir uma notificação, você deve ter um ícone na área de notificação. Em determinados casos, como o Microsoft Communicator ou o nível da bateria, esse ícone já estará presente. Em muitos outros casos, no entanto, você adicionará um ícone à área de notificação apenas enquanto for necessário para mostrar a notificação. Em ambos os casos, isso é realizado usando a função Shell_NotifyIcon . Shell_NotifyIcon permite adicionar, modificar ou excluir um ícone na área de notificação.

área de notificação que contém três ícones

Quando um ícone é adicionado à área de notificação no Windows 7, ele é adicionado à seção de estouro da área de notificação por padrão. Essa área contém ícones de área de notificação que estão ativos, mas não visíveis na área de notificação. Somente o usuário pode promover um ícone do estouro para a área de notificação, embora em determinadas circunstâncias o sistema possa promover temporariamente um ícone na área de notificação como uma breve visualização (menos de um minuto).

Observação

O usuário deve ter a palavra final sobre quais ícones deseja ver em sua área de notificação. Antes de instalar um ícone não transitório na área de notificação, o usuário deve ser solicitado a solicitar permissão. Eles também devem receber a opção (normalmente, embora seu menu de atalho) para remover o ícone da área de notificação.

 

A estrutura NOTIFYICONDATA enviada na chamada para Shell_NotifyIcon contém informações que especificam o ícone da área de notificação e a notificação em si. Veja a seguir os itens específicos para o próprio ícone da área de notificação que pode ser definido por meio de NOTIFYICONDATA.

  • O recurso do qual o ícone é obtido.
  • Um identificador exclusivo para o ícone.
  • O estilo da dica de ferramenta do ícone.
  • O estado do ícone (oculto, compartilhado ou ambos) na área de notificação.
  • O identificador de uma janela de aplicativo associada ao ícone.
  • Um identificador de mensagem de retorno de chamada que permite que o ícone comunique eventos que ocorrem dentro do retângulo delimitador do ícone e notificação de balão com a janela do aplicativo associada. O retângulo delimitador do ícone pode ser recuperado por meio de Shell_NotifyIconGetRect.

Cada ícone na área de notificação pode ser identificado de duas maneiras:

  • O GUID com o qual o ícone é declarado no registro. Esse é o método preferencial no Windows 7 e posterior.
  • O identificador de uma janela associada ao ícone da área de notificação, além de um identificador de ícone definido pelo aplicativo. Esse método é usado no Windows Vista e anterior.

Os ícones na área de notificação podem ter uma dica de ferramenta. A dica de ferramenta pode ser uma dica de ferramenta padrão (preferencial) ou uma interface do usuário pop-up desenhada pelo aplicativo. Embora uma dica de ferramenta não seja necessária, é recomendável.

Os ícones da área de notificação devem ter alto reconhecimento de DPI. Um aplicativo deve fornecer um ícone de 16 x 16 pixels e um ícone 32x32 em seu arquivo de recurso e, em seguida, usar LoadIconMetric para garantir que o ícone correto seja carregado e dimensionado adequadamente.

O aplicativo responsável pelo ícone da área de notificação deve manipular um clique do mouse para esse ícone. Quando um usuário clica com o botão direito do mouse no ícone, ele deve abrir um menu de atalho normal. No entanto, o resultado de um único clique com o botão esquerdo do mouse variará com a função do ícone. Ele deve exibir o que o usuário esperaria ver no formulário mais adequado para esse conteúdo— uma janela pop-up, uma caixa de diálogo ou a própria janela do programa. Por exemplo, ele pode mostrar status texto para um ícone de status ou um controle deslizante para o controle de volume.

O posicionamento de uma janela pop-up ou caixa de diálogo resultante do clique deve ser colocado próximo à coordenada do clique na área de notificação. Use CalculatePopupWindowPosition para determinar sua localização.

O ícone pode ser adicionado à área de notificação sem exibir uma notificação definindo apenas os membros específicos do ícone de NOTIFYICONDATA (discutido acima) e chamando Shell_NotifyIcon conforme mostrado aqui:

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

Você também pode adicionar o ícone à área de notificação e exibir uma notificação em uma única chamada para Shell_NotifyIcon. Para fazer isso, continue com as instruções neste tópico.

Definir a versão NOTIFYICONDATA

À medida que o Windows avança, a estrutura NOTIFYICONDATA foi expandida para incluir mais membros para definir mais funcionalidade. As constantes são usadas para declarar qual versão de NOTIFYICONDATA usar com o ícone da área de notificação, para permitir a compatibilidade com versões anteriores. A menos que haja um motivo convincente para fazer o contrário, é altamente recomendável que você use a versão NOTIFYICON_VERSION_4, introduzida no Windows Vista. Esta versão fornece a funcionalidade disponível completa, incluindo a capacidade preferencial de identificar o ícone da área de notificação por meio de um GUID registrado, um mecanismo de retorno de chamada superior e melhor acessibilidade.

Defina a versão por meio das seguintes chamadas:

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

Observe que essa chamada para Shell_NotifyIcon não exibe uma notificação.

Definir a Aparência e o Conteúdo da Notificação

Uma notificação é um tipo especial de controle de dica de ferramenta de balão. Ele contém um título, um corpo de texto e um ícone. Como uma janela, ela tem um botão Fechar no canto superior direito. Ele também contém um botão Opções que abre o item Ícones da Área de Notificação no Painel de Controle, que permite que o usuário mostre ou oculte o ícone ou mostre apenas notificações sem um ícone.

captura de tela do balão de notificação indicando que a energia da bateria está baixa

A estrutura NOTIFYICONDATA enviada na chamada para Shell_NotifyIcon contém informações que especificam o ícone da área de notificação e o próprio balão de notificação. Veja a seguir os itens específicos da notificação que podem ser definidos por meio de NOTIFYICONDATA.

  • Um ícone a ser exibido no balão de notificação, que é especificado pelo tipo de notificação. O tamanho do ícone pode ser especificado, bem como ícones personalizados.
  • Um título de notificação. Esse título deve ter no máximo 48 caracteres em inglês (para acomodar a localização). O título é a primeira linha da notificação e separado por meio do uso de tamanho, cor e peso da fonte.
  • Texto para uso no corpo da notificação. Esse texto deve ter no máximo 200 caracteres em inglês (para acomodar a localização).
  • Se a notificação deve ser descartada se não puder ser exibida imediatamente.
  • Um tempo limite para a notificação. Essa configuração é ignorada no Windows Vista e em sistemas posteriores em favor de uma configuração de tempo limite de acessibilidade em todo o sistema.
  • Se a notificação deve respeitar o tempo de silêncio, defina por meio do sinalizador NIIF_RESPECT_QUIET_TIME .

Observação

As interfaces IUserNotification e IUserNotification2 são wrappers COM (Component Object Model) para Shell_NotifyIcon. No entanto, no momento, eles não fornecem a funcionalidade de NOTIFYICON_VERSION_4 completa disponível por meio de Shell_NotifyIcon diretamente, incluindo o uso de um GUID para identificar o ícone da área de notificação.

 

Verificar o Status do Usuário

O sistema usa a função SHQueryUserNotificationState é usada para marcar se o usuário está em tempo de silêncio, longe do computador ou em um estado ininterrupto, como o modo De apresentação. Se o sistema exibe sua notificação depende desse estado.

Observação

Se o aplicativo estiver usando um método de notificação personalizado que não usa Shell_NotifyIcon, IUserNotification ou IUserNotification2, ele sempre deve chamar explicitamente SHQueryUserNotificationState para determinar se ele deve exibir a interface do usuário de notificação nesse momento.

 

As notificações enviadas quando o usuário estiver ausente estão na fila para exibição, mas como você não pode saber quando o usuário retornará ou se a notificação ainda será válida nesse momento, você pode considerar reenviar a notificação mais tarde.

As notificações enviadas durante o tempo de silêncio são descartadas sem apresentação. As diretrizes de design pedem que todas as notificações sejam ignoráveis. Eles não devem exigir ação imediata do usuário. Portanto, nenhuma notificação é tão importante que ela deve substituir o tempo de silêncio.

Exibir a notificação

Depois de definir a versão NOTIFYICONDATA e definir a notificação em uma estrutura NOTIFYICONDATA , chame Shell_NotifyIcon para exibir o ícone.

  • Se o ícone da área de notificação não estiver presente, chame Shell_NotifyIcon para adicionar o ícone. Faça isso para ícones transitórios e não transitórios.

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_ADD, &nid);
    
  • Se o ícone da área de notificação já estiver presente, chame Shell_NotifyIcon para modificar o ícone.

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

O código a seguir mostra um exemplo de como definir os dados NOTIFYICONDATA e enviá-los por meio de Shell_NotifyIcon. Observe que este exemplo identifica o ícone de notificação por meio de um GUID (preferencial no 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;

Removendo um ícone

Para remover um ícone, por exemplo, quando você adicionou apenas o ícone temporariamente para transmitir uma notificação, chame Shell_NotifyIconconforme mostrado aqui. Somente uma estrutura NOTIFYICONDATA mínima que identifica o ícone é necessária nesta chamada.

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

Observação

Quando um aplicativo é desinstalado, seu ícone de área de notificação ainda pode aparecer para o usuário como uma opção na página Ícones da Área de Notificação no Painel de Controle por até sete dias. No entanto, as alterações feitas não terão efeito.

 

Exemplo de SDK

Consulte o exemplo notificationIcon no SDK (Software Development Kit) do Windows para obter um exemplo completo do uso de Shell_NotifyIcon.

Shell_notifyicon

Shell_NotifyIconGetRect

NOTIFYICONDATA

SHQueryUserNotificationState

IUserNotification

IUserNotification2

A barra de tarefas

Extensões da barra de tarefas