Criei uma biblioteca que permite colocar a UI do meu app na barra de tarefas do Windows 11.
(github.com/airtaxi)Recentemente publiquei uma biblioteca que permite inserir diretamente a UI de um app dentro da barra de tarefas (taskbar) do Windows 11. O nome é Deskband11Lib e, ao instalar via NuGet, dá para transformar apps WinUI 3 ou WPF em widgets da barra de tarefas.
Vou explicar por que a criei, como ela funciona e também mostrar o widget PoC que cheguei a publicar na Store.
Contexto: os deskbands que desapareceram no Windows 11
Até o Windows 10, existia o recurso de deskbands na barra de tarefas, que permitia exibir pequenas barras de ferramentas. Ao migrar para o Windows 11, esse recurso simplesmente desapareceu. Para quem queria manter na barra de tarefas “pequenos widgets sempre visíveis”, como controles de mídia, monitor do sistema ou inicialização rápida, foi uma mudança bem decepcionante.
Inspiração: zadjii's Deskband11
Há pouco tempo vi o projeto zadjii/Deskband11 no GitHub, e a abordagem central era realmente brilhante.
Colocar uma janela transparente em WinUI 3 sobre a barra de tarefas, definir essa janela como HWND filho da barra de tarefas com
SetParente então ajustar a região de recorte ao tamanho do conteúdo para fazê-la parecer parte da própria barra de tarefas.
No fim das contas, “é só uma janela flutuando sobre a barra de tarefas”, mas a ideia em si era muito inteligente. Só que o projeto original se descrevia como “código em nível de hackathon”, e havia limitações para usá-lo em um produto real.
Então transformei isso em uma biblioteca
Como a ideia era boa demais para se perder, reescrevi tudo como uma biblioteca para que qualquer pessoa pudesse usar com uma simples linha de dotnet add package.
- GitHub: https://github.com/airtaxi/Deskband11Lib
- NuGet:
Deskband11Lib.WinUI/Deskband11Lib.Wpf
O uso é simples
Basta criar uma janela WinUI 3 e passá-la para TaskbarContentHost.
var window = new MainWindow();
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions
{
PreferredWidth = 360,
PreferredHeight = 48
});
await host.AttachWhenLayoutReadyAsync();
window.Activate();
No WPF, a API é quase igual. A biblioteca cuida automaticamente de detectar o alinhamento da barra de tarefas (esquerda/centro), evitar sobreposição com o botão Iniciar e a área de notificações, restaurar o funcionamento quando o Explorer reinicia e até animar mudanças de layout.
Levou um bom tempo para fazer isso funcionar
Quando executei o código original como estava, ele até abria, mas a posição e o tamanho da janela ficavam completamente errados. Como era um código feito para um hackathon, no começo não dava para saber se o problema era a implementação da barra de tarefas ter mudado com atualizações do Windows 11, ou se o código original já tinha inconsistências. Como ambos podiam ser a causa, não havia alternativa além de desmontar a parte da barra de tarefas peça por peça e verificar diretamente como tudo se comportava na build atual. Além disso, o original nem sequer considerava casos como o botão Iniciar centralizado ou elementos como o botão de widgets, então foi preciso tratar tudo isso ao transformar o projeto em biblioteca.
Por isso, do código original aproveitei apenas a forma de usar UI Automation e algumas APIs Win32 para obter tamanho e posição da janela, e reescrevi do zero toda a lógica de cálculo do espaço livre. Era preciso ler a posição do botão Iniciar, do grupo de botões de apps na barra de tarefas, do botão de widgets e da área de notificações para calcular o espaço restante. Além disso, dependendo de a barra estar alinhada à esquerda ou ao centro, a área livre muda de lugar, então também precisei levar isso em conta.
Criei um app real e publiquei na Store: BarPlay
Para verificar se a biblioteca realmente era útil, criei um app com ela e o publiquei na Microsoft Store. O nome é BarPlay.
É um widget que mostra na barra de tarefas a miniatura, o título e os controles da mídia em reprodução. Funciona com qualquer app que ofereça suporte ao Windows System Media Transport Controls (SMTC), como Spotify, navegador ou apps PWA do YouTube. Compilei com NativeAOT para minimizar o tempo de inicialização e o uso de recursos.
Link do app na Microsoft Store
Mostrei primeiro para algumas pessoas próximas e a reação foi muito boa.
Em que isso pode ser usado
É possível colocar conteúdo feito em WinUI 3 ou WPF em uma área sempre visível, sem abrir uma janela separada. Dá para imaginar usos como timer, controles de reprodução de mídia (como o BarPlay), status de build ou notificações de CI, monitor do sistema, quick launcher, troca de conta ou indicadores de notificação.
Como você pode levar para a barra de tarefas os controles e o estilo do seu próprio app, acredito que esta seja praticamente a única biblioteca .NET capaz de recriar esse tipo de experiência no Windows 11 após o desaparecimento dos deskbands.
Coleção de links
- Deskband11Lib (biblioteca)
- NuGet (WinUI)
- NuGet (WPF)
- BarPlay (Proof of Concept, Store)
- BarPlay (código-fonte)
- Inspiração original (zadjii/Deskband11)
A licença é MIT, e você pode começar copiando os projetos de exemplo (Deskband11Lib.WinUI.Sample, Deskband11Lib.Wpf.Sample). Feedback, issues e PRs são todos bem-vindos. Se você criar um widget interessante para a barra de tarefas, me avise.
2 comentários
Nossa, a ideia é muito boa mesmo.
Obrigado! Na verdade, eu só transformei em uma biblioteca, mas acho que isso se deve à ideia de quem criou originalmente.. hehe