Compartilhar via


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 de notificações e status. Também pode ser usada para exibir ícones de recursos do sistema e do programa que não estão presentes na área de trabalho, como nível da bateria, controle de volume e status da rede. A área de notificação é conhecida historicamente como bandeja do sistema ou área de status.

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 as práticas recomendadas no uso de notificações e na área de notificação. O objetivo é proporcionar benefícios ao usuário por meio do uso adequado de notificações, sem que sejam inconvenientes ou distrativas.

A área de notificação não é para informações críticas que demandam ações imediatas. Também não se destina ao acesso rápido a programas ou comandos. Desde o Windows 7, grande parte dessa funcionalidade é melhor realizada por meio do botão da barra de tarefas de um aplicativo.

O Windows 7 permite que o usuário suprima todas as notificações de um aplicativo, se quiser. Portanto, um design e uso cuidadosos das notificações irão incentivar o usuário a permitir que seu aplicativo continue a exibi-las. As notificações são uma interrupção, garanta que elas valham a pena.

O Windows 7 apresenta o conceito de "tempo de silêncio". O tempo de silêncio é definido como a primeira hora após um novo usuário fazer login em sua conta pela primeira vez ou pela primeira vez após uma atualização do sistema operacional ou instalação limpa. 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 período, a maioria das notificações não deve ser enviada ou exibida. As exceções incluem o feedback que o usuário esperaria ver em resposta a uma ação, como quando ele conecta um dispositivo USB ou imprime um documento. As especificidades da API em relação ao tempo de silêncio serão abordadas mais adiante neste tópico.

Criar e exibir uma notificação

As seções restantes neste tópico descrevem o procedimento básico a ser seguido 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. Remover 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 no Microsoft Communicator ou no nível da bateria, esse ícone já estará presente. No entanto, em muitos outros casos, você adicionará um ícone à área de notificação apenas enquanto for necessário para mostrar a notificação. Nos dois casos, isso é feito usando a função Shell_NotifyIcon. A função Shell_NotifyIcon permite adicionar, modificar ou excluir um ícone na área de notificação.

área de notificação com 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 da á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 certas circunstâncias, o sistema possa promover temporariamente um ícone na área de notificação como uma visualização curta (menos de um minuto).

Observação

O usuário deverá ter a decisão 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, deve ser solicitada permissão ao usuário. Ele também deve ter a opção (geralmente através do menu de atalho) de 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 própria notificação. A seguir estão os itens específicos do próprio ícone da área de notificação que podem ser definidos 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 da 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 formas:

  • 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 em versões anteriores.

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 de usuário pop-up desenhada pelo aplicativo. Embora uma dica de ferramenta não seja obrigatória, é recomendada.

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 de 32 x 32 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 lidar com um clique do mouse nesse í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 varia de acordo com a função do ícone. Ele deve exibir o que o usuário espera ver no formato mais adequado para aquele conteúdo: uma janela pop-up, uma caixa de diálogo ou a própria janela do programa. Por exemplo, pode mostrar o texto de status de 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 próximo à coordenada do clique na área de notificação. Use o 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 (abordado 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 evoluiu, a estrutura NOTIFYICONDATA foi expandida para incluir mais membros e definir mais funcionalidades. Constantes são usadas para declarar qual versão do NOTIFYICONDATA usar com o ícone da área de notificação, para permitir 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 todas as funcionalidades disponíveis, 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, corpo de texto e um ícone. Como uma janela, ele tem um botão Fechar no canto superior direito. Também tem um botão Opções que abre o item Ícones da Área de notificação no Painel de Controle, que permite ao usuário mostrar ou ocultar o ícone ou mostrar apenas notificações sem um ícone.

captura de tela do balão de notificação indicando que a 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 balão de notificação em si. A seguir estão 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 os ícones personalizados.
  • Um título de notificação. Este 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 se diferencia pelo uso do tamanho, cor e peso da fonte.
  • Texto para uso no corpo da notificação. Este texto deve ter no máximo 200 caracteres em inglês (para acomodar a localização).
  • Se a notificação deverá 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, dando preferência a uma configuração de tempo limite de acessibilidade em todo o sistema.
  • Se a notificação deverá respeitar o tempo de silêncio, definido 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. Entretanto, neste momento, não fornecem a funcionalidade NOTIFYICON_VERSION_4 completa disponível diretamente pelo Shell_NotifyIcon, 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 para verificar 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 exibirá a notificação dependerá deste 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 deverá chamar SHQueryUserNotificationState explicitamente para determinar se deve exibir a interface do usuário de notificação naquele momento.

 

As notificações enviadas quando o usuário está ausente são enfileiradas para exibição, mas como você não pode saber quando o usuário retornará ou se a notificação ainda será válida naquele momento, considere reenviá-la mais tarde.

As notificações enviadas durante o tempo de silêncio são descartadas sem serem exibidas. As diretrizes de design pedem que todas as notificações sejam ignoráveis. Elas não devem exigir ação imediata do usuário. Portanto, nenhuma notificação é tão importante que deva 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 estiver ausente, 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 configuração de dados NOTIFYICONDATA e envio 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;

Remover um ícone

Para remover um ícone (por exemplo, quando você adicionou o ícone apenas temporariamente para transmitir uma notificação) chame Shell_NotifyIconconforme mostrado aqui. Apenas 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, quaisquer alterações feitas não terão efeito.

 

Exemplo de SDK

Veja o exemplo NotificationIcon Sample no SDK (Software Development Kit) para um exemplo completo do uso do Shell_NotifyIcon.

Shell_NotifyIcon

Shell_NotifyIconGetRect

NOTIFYICONDATA

SHQueryUserNotificationState

IUserNotification

IUserNotification2

A Barra de Tarefas

Extensões da barra de tarefas