A Barra de Tarefas
A interface do Windows inclui uma barra de ferramentas especial da área de trabalho do aplicativo chamada barra de tarefas. Você pode usar a barra de tarefas para tarefas como alternar entre janelas abertas e iniciar novos aplicativos.
Observação
Para obter informações sobre as alterações feitas na barra de tarefas a partir do Windows 7, consulte Extensões da barra de tarefas.
Este tópico inclui as seções a seguir.
Sobre a barra de tarefas
A barra de tarefas inclui o seguinte:
- Menu Iniciar
- Barra de Início Rápido (Somente Windows Vista e anterior)
- Botões da barra de tarefas
- Barras de ferramentas (opcional)
- Área de notificação
O menu Iniciar contém comandos que podem acessar programas, documentos e configurações. Esses comandos incluem Todos os Programas, Documentos, Painel de Controle, Jogos, Ajuda e Suporte, Desligar e Pesquisar programas e arquivos.
A tela Iniciar em versões anteriores do Windows continha itens como Localizar e Executar, cujo recurso foi incluído em Pesquisar programas e arquivos no Windows Vista e posteriores.
A barra de Início Rápido, disponível em versões do Windows anteriores ao Windows 7, contém atalhos para aplicativos. O Windows fornece entradas padrão, como Explorer da Internet do Windows, e o usuário pode adicionar mais atalhos que escolher. Os ícones nessa área respondem a um único clique. No Windows 7 e posteriores, essa funcionalidade é incluída nos botões da barra de tarefas.
O Shell coloca um botão na barra de tarefas sempre que um aplicativo cria uma janela sem proprietário, ou seja, uma janela que não tem um pai e que tem os bits de estilo estendido apropriados (consulte Gerenciando botões da barra de tarefas, abaixo). Para alternar para uma janela, o usuário clica no botão de janela. Essa funcionalidade foi muito expandida a partir do Windows 7. Para obter mais informações, consulte Extensões da barra de tarefas.
Os aplicativos podem colocar ícones na área de notificação para indicar o status de uma operação ou notificar o usuário sobre um evento. Por exemplo, um aplicativo pode colocar um ícone de impressora na área de notificação para mostrar que um trabalho de impressão está em andamento. No entanto, no Windows 7 e posteriores, algumas das informações fornecidas anteriormente pela área de notificação devem ser fornecidas por meio do botão de barra de tarefas de um aplicativo. A área de notificação está localizada na borda direita da barra de tarefas (se a barra de tarefas for horizontal) ou na parte inferior (se a barra de tarefas for vertical). Para obter mais informações, consulte Notificações e a Área de Notificação.
A área de notificação também exibirá a hora atual se essa opção estiver selecionada. A opção é encontrada como:
- Windows 7 e posterior: a lista suspensa Relógio na página Ativar ou desativar ícones do sistema dos Ícones da Área de Notificação Painel de Controle aplicativo (também acessível por meio das propriedades da área de notificação).
- Windows Vista: a caixa marcar Relógio na página Área de Notificação da janela Propriedades barra de tarefas e Menu Iniciar.
- Windows XP: a caixa Mostrar o relógio marcar na janela propriedades Barra de Tarefas e Menu Iniciar.
O usuário pode clicar com o botão direito do mouse na barra de tarefas para exibir o menu de atalho. O menu de atalho inclui comandos para janelas em cascata, janelas de pilha, mostrar janelas lado a lado, mostrar a área de trabalho, iniciar o Gerenciador de Tarefas e definir propriedades da barra de tarefas. O menu de atalho também fornece a opção de adicionar ou remover um conjunto de barras de ferramentas da barra de tarefas. Você pode adicionar novas barras de ferramentas a esse menu registrando-as na categoria CATID_DeskBand. Para obter mais informações, consulte Implementando objetos de banda. Observe que, a partir do Windows 7, a barra de tarefas e a área de notificação têm menus de atalho separados. Esses menus de atalho compartilham algumas opções, como a disposição da janela, e adicionam outras.
Opções de exibição da barra de tarefas
A barra de tarefas dá suporte a duas opções de exibição: Ocultar automaticamente e, no Windows Vista e somente anteriores, Always On Superior (a barra de tarefas está sempre nesse modo no Windows 7 e posterior). Para definir essas opções, o usuário deve abrir o menu de atalho da barra de tarefas, clicar em Propriedades e selecionar ou desmarcar a caixa Ocultar automaticamente a barra de tarefas marcar ou a caixa Manter a barra de tarefas sobre outras janelas marcar. Para recuperar o estado dessas opções de exibição, use a mensagem ABM_GETSTATE . Se você quiser ser notificado quando o estado dessas opções de exibição for alterado, processe a mensagem de notificação ABN_STATECHANGE no procedimento de janela. Para alterar o estado dessas opções de exibição, use a mensagem ABM_SETSTATE .
A área de trabalho é a parte da tela não obscurecida pela barra de tarefas. Para recuperar o tamanho da área de trabalho, chame a função SystemParametersInfo com o valor SPI_GETWORKAREA definido. Para recuperar as coordenadas do retângulo que descrevem o local da barra de tarefas, use a mensagem ABM_GETTASKBARPOS .
É possível cobrir a barra de tarefas definindo explicitamente o tamanho do retângulo da janela igual ao tamanho da tela com SetWindowPos. Para sistemas Windows 2000 ou posteriores, a janela deve não ter WS_CAPTION ou WS_THICKFRAME, ou então a janela deve ser dimensionada para que a área do cliente cubra toda a tela. Além disso, especialmente para esses sistemas, se a barra de tarefas estiver definida como Always On Top, ela permanecerá oculta somente enquanto o aplicativo for o aplicativo em primeiro plano.
Adicionando atalhos ao menu Iniciar
Para adicionar um item ao submenu Programas no Microsoft Windows NT 4.0, Windows 2000 e posterior, ou Windows 95 ou posterior, siga estas etapas.
- Crie um link de shell usando a interface IShellLink .
- Obtenha o PIDL da pasta Programas usando SHGetSpecialFolderLocation, passando CSIDL_PROGRAMS.
- Adicione o link do Shell à pasta Programas. Você também pode criar uma pasta na pasta Programas e adicionar o link a essa pasta.
Gerenciando botões da barra de tarefas
O Shell cria um botão na barra de tarefas sempre que um aplicativo cria uma janela que não é de propriedade. Para garantir que o botão de janela seja colocado na barra de tarefas, crie uma janela sem proprietário com o estilo estendido WS_EX_APPWINDOW . Para impedir que o botão de janela seja colocado na barra de tarefas, crie a janela sem proprietário com o estilo estendido WS_EX_TOOLWINDOW . Como alternativa, você pode criar uma janela oculta e tornar essa janela oculta o proprietário da janela visível.
O Shell removerá o botão de uma janela da barra de tarefas somente se o estilo da janela der suporte a botões visíveis da barra de tarefas. Se você quiser alterar dinamicamente o estilo de uma janela para uma que não dá suporte a botões visíveis da barra de tarefas, você deve ocultar a janela primeiro (chamando ShowWindow com SW_HIDE), alterar o estilo da janela e, em seguida, mostrar a janela.
O botão janela normalmente contém o ícone e o título do aplicativo. No entanto, se o aplicativo não contiver um menu do sistema, o botão de janela será criado sem o ícone.
Se você quiser que seu aplicativo receba a atenção do usuário quando a janela não estiver ativa, use a função FlashWindow para informar ao usuário que uma mensagem está aguardando. Essa função pisca o botão da janela. Depois que o usuário clicar no botão da janela para ativar a janela, seu aplicativo poderá exibir a mensagem.
Modificando o conteúdo da barra de tarefas
A versão 4.71 e posterior de Shell32.dll adiciona a capacidade de modificar o conteúdo da barra de tarefas. Em um aplicativo, agora você pode adicionar, remover e ativar botões da barra de tarefas. Ativar o item não ativa a janela; ele mostra o item conforme pressionado na barra de tarefas.
Os recursos de modificação da barra de tarefas são implementados em um objeto COM (modelo de objeto de componente) (CLSID_TaskbarList ) que expõe a interface ITaskbarList (IID_ITaskbarList). Você deve chamar o método ITaskbarList::HrInit para inicializar o objeto. Em seguida, você pode usar os métodos da interface ITaskbarList para modificar o conteúdo da barra de tarefas.
Adicionar, modificar e excluir ícones na área de notificação
Use a função Shell_NotifyIcon para adicionar, modificar ou excluir ícones da área de notificação. O parâmetro dwMessage de Shell_NotifyIcon é uma mensagem para a barra de tarefas que especifica a ação a ser tomada. O parâmetro pnid é um ponteiro para uma estrutura NOTIFYICONDATA que é usada para identificar o ícone e passar informações adicionais necessárias para o sistema processar a mensagem.
Você pode executar as ações a seguir com ícones da área de notificação.
- Para adicionar um ícone à área de notificação da barra de tarefas, chame Shell_NotifyIcon com o parâmetro dwMessage definido como NIM_ADD. A estrutura NOTIFYICONDATA é usada para especificar o identificador e o identificador do ícone e qualquer texto de dica de ferramenta. Se o usuário tiver selecionado a caixa Mostrar Relógio marcar nas propriedades da barra de tarefas, o sistema colocará o ícone à esquerda imediata do relógio. Caso contrário, o ícone será exibido no lado direito ou na parte inferior da barra de tarefas. Todos os ícones existentes são deslocados para a esquerda para abrir espaço para o novo ícone.
- Para modificar as informações de um ícone, incluindo seu identificador de ícone, texto de dica de ferramenta e identificador de mensagem de retorno de chamada, chame Shell_NotifyIcon com dwMessage definido como NIM_MODIFY.
- Para excluir um ícone da área de notificação, chame Shell_NotifyIcon com o parâmetro dwMessage definido como NIM_DELETE.
Quando você concluir uma operação de interface do usuário, retorne o foco para a área de notificação chamando Shell_NotifyIcon com dwMessage definido como NIM_SETFOCUS. Por exemplo, você pode fazer isso quando um ícone da barra de tarefas exibe um menu de atalho, mas o usuário o cancela pressionando a tecla ESCAPE.
Recebendo mensagens de retorno de chamada da área de notificação
Os aplicativos geralmente colocam ícones na área de notificação da barra de tarefas para servir como indicadores de status. Você pode fornecer informações adicionais quando o usuário executa ações do mouse, como mover o ponteiro do mouse sobre o ícone ou clicar no ícone.
O sistema notifica você sobre eventos de mouse e teclado enviando uma mensagem de retorno de chamada definida pelo aplicativo associada a um ícone específico. Dessa forma, o sistema pode notificar um aplicativo quando o usuário, por exemplo, clica no ícone ou o seleciona pressionando uma tecla.
Você define a mensagem de retorno de chamada de um ícone ao adicionar o ícone à barra de tarefas. O identificador de mensagem de retorno de chamada é especificado no membro uCallbackMessage da estrutura NOTIFYICONDATA passada com NIM_ADD. Quando ocorre um evento, o sistema envia a mensagem de retorno de chamada para o procedimento de janela da janela especificada pelo membro hWnd . O parâmetro wParam da mensagem contém o identificador do ícone da barra de tarefas no qual o evento ocorreu. O parâmetro lParam contém a mensagem de mouse ou teclado associada ao evento. Por exemplo, quando o ponteiro do mouse se move para um ícone da barra de tarefas, lParam contém WM_MOUSEMOVE.
Os resultados de vários eventos do mouse podem ser resumidos da seguinte maneira:
- Quando o usuário move o ponteiro do mouse sobre o ícone, o sistema exibe o texto da dica de ferramenta especificado em NOTIFYICONDATA.
- Quando o usuário clica no ícone, seu aplicativo recebe uma notificação WM_LBUTTONDOWN .
- Quando o usuário clica com o botão direito do mouse no ícone, seu aplicativo recebe uma notificação WM_RBUTTONDOWN .
- Quando o usuário clica duas vezes no ícone, seu aplicativo recebe uma notificação WM_LBUTTONDBLCLK .
Normalmente, clicar no ícone faz com que o aplicativo exiba uma janela com informações adicionais, clicar com o botão direito do mouse exibe um menu de atalho e clicar duas vezes executa o comando de menu de atalho padrão.
Para obter um exemplo de como alterar o texto da dica de ferramenta associado a um ícone de área de notificação, consulte Dicas de ferramenta de balão para ícones da barra de status.
As versões 5.0 e posteriores do Shell manipulam Shell_NotifyIcon eventos de mouse e teclado de maneiras diferentes das versões anteriores do Shell encontradas no Windows NT 4.0, Windows 95 e Windows 98. As diferenças são:
- Se um usuário solicitar um menu de atalho de um ícone de notificação com o teclado, o Shell da versão 5.0 enviará ao aplicativo associado uma mensagem WM_CONTEXTMENU . Versões anteriores enviam mensagens WM_RBUTTONDOWN e WM_RBUTTONUP .
- Se um usuário selecionar um ícone de notificação com o teclado e ativá-lo com a barra de espaço ou a tecla ENTER, o Shell versão 5.0 enviará ao aplicativo associado uma notificação de NIN_KEYSELECT . Versões anteriores enviam mensagens WM_RBUTTONDOWN e WM_RBUTTONUP .
- Se um usuário selecionar um ícone de notificação com o mouse e ativá-lo com a tecla ENTER, o Shell da versão 5.0 enviará ao aplicativo associado uma notificação NIN_SELECT . Versões anteriores enviam mensagens WM_RBUTTONDOWN e WM_RBUTTONUP .
- Se um usuário passar o ponteiro do mouse sobre um ícone ao qual uma dica de ferramenta de balão está associada, o Shell da versão 6.0 (Windows XP)enviará as mensagens a seguir.
-
- NIN_BALLOONSHOW - Enviado quando o balão é mostrado (balões são enfileirados).
- NIN_BALLOONHIDE - Enviado quando o balão desaparece , por exemplo, quando o ícone é excluído. Esta mensagem não será enviada se o balão for ignorado devido a um tempo limite ou um clique do mouse.
- NIN_BALLOONTIMEOUT - Enviado quando o balão é descartado devido a um tempo limite.
- NIN_BALLOONUSERCLICK - Enviado quando o balão é ignorado devido a um clique do mouse.
-
Você pode selecionar como o Shell deve se comportar chamando Shell_NotifyIcon com dwMessage definido como NIM_SETVERSION. Defina o membro uVersion da estrutura NOTIFYICONDATA para indicar se você deseja o comportamento da versão 5.0 ou da pré-versão 5.0.
Notificação de criação da barra de tarefas
Com o Microsoft Internet Explorer 4.0 e posterior, o Shell notifica os aplicativos de que a barra de tarefas foi criada. Quando a barra de tarefas é criada, ela registra uma mensagem com a cadeia de caracteres TaskbarCreated e transmite essa mensagem para todas as janelas de nível superior. Quando o aplicativo da barra de tarefas recebe essa mensagem, ele deve assumir que todos os ícones da barra de tarefas adicionados foram removidos e adicioná-los novamente. Esse recurso geralmente se aplica somente aos serviços que já estão em execução quando o Shell é iniciado. O exemplo a seguir mostra um método muito simplificado para lidar com esse caso.
Em Windows 10, a barra de tarefas também transmite essa mensagem quando o DPI da exibição primária é alterado.
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
static UINT s_uTaskbarRestart;
switch(uMessage)
{
case WM_CREATE:
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
break;
default:
if(uMessage == s_uTaskbarRestart)
AddTaskbarIcons();
break;
}
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
Usando a barra de tarefas
Esta seção inclui exemplos que demonstram como adicionar ícones à área de notificação da barra de tarefas e como processar mensagens de retorno de chamada para ícones da barra de tarefas.
Adicionar e excluir ícones da barra de tarefas na área de notificação
Adicione um ícone à área de notificação da barra de tarefas preenchendo uma estrutura NOTIFYICONDATA e passando a estrutura para Shell_NotifyIcon com dwMessage definido como NIM_ADD. Os membros da estrutura devem especificar o identificador para a janela que está adicionando o ícone, bem como o identificador de ícone e o identificador de ícone. Você também pode especificar o texto da dica de ferramenta para o ícone. Se você precisar receber mensagens do mouse para o ícone, especifique o identificador da mensagem de retorno de chamada que o sistema deve usar para enviar a mensagem para o procedimento de janela.
A função no exemplo a seguir demonstra como adicionar um ícone à barra de tarefas.
// MyTaskBarAddIcon - adds an icon to the notification area.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window to receive callback messages
// uID - identifier of the icon
// hicon - handle to the icon to add
// lpszTip - tooltip text
BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = hicon;
if (lpszTip)
hr = StringCbCopyN(tnid.szTip, sizeof(tnid.szTip), lpszTip,
sizeof(tnid.szTip));
// TODO: Add error handling for the HRESULT.
else
tnid.szTip[0] = (TCHAR)'\0';
res = Shell_NotifyIcon(NIM_ADD, &tnid);
if (hicon)
DestroyIcon(hicon);
return res;
}
Para excluir um ícone da área de notificação da barra de tarefas, preencha uma estrutura NOTIFYICONDATA e chame Shell_NotifyIcon com dwMessage definido como NIM_DELETE. Ao excluir um ícone da barra de tarefas, especifique apenas os membros cbSize, hWnd e uID da estrutura. Por exemplo:
// MyTaskBarDeleteIcon - deletes an icon from the notification area.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window that added the icon.
// uID - identifier of the icon to delete.
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
res = Shell_NotifyIcon(NIM_DELETE, &tnid);
return res;
}
Recebendo eventos do mouse
Se você especificar uma mensagem de retorno de chamada para um ícone de barra de tarefas, o sistema enviará a mensagem para seu aplicativo sempre que um evento do mouse ocorrer no retângulo delimitador do ícone. O parâmetro wParam da mensagem especifica o identificador do ícone da barra de tarefas e o parâmetro lParam da mensagem especifica a mensagem que o sistema gerou como resultado do evento do mouse.
A função no exemplo a seguir é de um aplicativo que adiciona ícones de bateria e impressora à barra de tarefas. O aplicativo chama a função quando recebe uma mensagem de retorno de chamada. A função determina se o usuário clicou em um dos ícones e, se ocorreu um clique, chama uma função definida pelo aplicativo para exibir status informações.
// On_MYWM_NOTIFYICON - processes callback messages for taskbar icons.
// wParam - first message parameter of the callback message.
// lParam - second message parameter of the callback message.
void On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam)
{
UINT uID;
UINT uMouseMsg;
uID = (UINT) wParam;
uMouseMsg = (UINT) lParam;
if (uMouseMsg == WM_LBUTTONDOWN)
{
switch (uID)
{
case IDI_MYBATTERYICON:
// The user clicked the battery icon. Display the
// battery status.
ShowBatteryStatus();
break;
case IDI_MYPRINTERICON:
// The user clicked the printer icon. Display the
// status of the print job.
ShowJobStatus();
break;
default:
break;
}
}
return;
}