2 puntos por kck4156 5 시간 전 | 2 comentarios | Compartir por WhatsApp

Hace poco publiqué una biblioteca que permite insertar directamente la UI de una app dentro de la barra de tareas de Windows 11. Se llama Deskband11Lib y, si la instalas con NuGet, puedes convertir apps de WinUI 3 o WPF en widgets para la barra de tareas.

Les voy a contar por qué la hice, cómo funciona y también mostrarles un widget PoC que incluso publiqué en la Store.


Contexto: los deskbands desaparecieron en Windows 11

Hasta Windows 10 existía la función de deskbands, que permitía mostrar pequeñas barras de herramientas en la barra de tareas. Al pasar a Windows 11, esta función desapareció por completo. Para quienes querían tener en la barra de tareas “pequeños widgets siempre visibles”, como controles multimedia, monitores del sistema o accesos rápidos, fue un cambio bastante decepcionante.

Inspiración: Deskband11 de zadjii

Hace poco vi zadjii/Deskband11 en GitHub, y su enfoque central me pareció brillante.

Poner una ventana transparente de WinUI 3 encima de la barra de tareas, convertir esa ventana en un HWND hijo de la barra de tareas con SetParent, y luego ajustar una región de recorte al tamaño del contenido para que parezca parte de la barra de tareas.

Al final, “solo es una ventana flotando sobre la barra de tareas”, pero la idea me pareció increíblemente ingeniosa. Eso sí, el proyecto original se describía a sí mismo como “código nivel hackathon”, y tenía varias limitaciones para usarlo en un producto real.

Así que lo convertí en una biblioteca

Como la idea era demasiado buena para dejarla pasar, la reescribí como biblioteca para que cualquiera pueda usarla con una sola línea de dotnet add package.

Cómo se usa

Solo tienes que crear una ventana de WinUI 3 y pasarla a TaskbarContentHost.

var window = new MainWindow();  
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions  
{  
    PreferredWidth = 360,  
    PreferredHeight = 48  
});  
  
await host.AttachWhenLayoutReadyAsync();  
window.Activate();  

En WPF la API es casi igual. La biblioteca se encarga automáticamente de detectar la alineación de la barra de tareas (izquierda/centro), evitar superposiciones con el botón de Inicio y el área de notificaciones, recuperarse cuando Explorer se reinicia e incluso manejar las animaciones cuando cambia el layout.


Hacer que funcionara tomó bastante tiempo

Cuando probé el código original tal cual, sí ejecutaba, pero la posición y el tamaño de la ventana quedaban mal. Como era código hecho para un hackathon, al principio no estaba claro si el problema era que la implementación de la barra de tareas había cambiado con las actualizaciones de Windows 11, o si el código original ya venía desalineado desde antes. Como ambas cosas podían ser la causa, no quedó otra que ir desarmando parte por parte cómo funcionaba realmente la barra de tareas en el build actual. Además, el original no contemplaba para nada casos como el botón de Inicio centrado o elementos como el botón de widgets, así que al convertirlo en biblioteca tuve que encargarme también de eso.

Por eso, del proyecto original solo tomé como referencia la forma de usar UI Automation y algunos Win32 API para calcular tamaño y posición de ventana, pero reescribí desde cero la lógica que calcula el espacio libre. Había que leer la posición del botón de Inicio, el grupo de botones de apps de la barra de tareas, el botón de widgets y el área de notificaciones para obtener el espacio restante. Además, según si la barra de tareas está alineada a la izquierda o al centro, el lugar donde queda espacio cambia, así que también hubo que considerar esas diferencias.


Hice una app real y la publiqué en la Store: BarPlay

Quería comprobar si la biblioteca realmente era útil, así que hice una app con ella y la publiqué en Microsoft Store. Se llama BarPlay.

Es un widget que muestra en la barra de tareas la miniatura, el título y los controles del contenido multimedia que se está reproduciendo. Funciona con cualquier app que soporte Windows System Media Transport Controls (SMTC), como Spotify, navegadores o apps PWA de YouTube. La compilé con NativeAOT para minimizar el tiempo de arranque y el uso de recursos.

Enlace de la app en Microsoft Store

Primero se la mostré a algunas personas cercanas y la reacción fue bastante buena.


Para qué se podría usar

Puedes colocar contenido hecho con WinUI 3 o WPF en un lugar siempre visible sin abrir una ventana aparte. Se me ocurren usos como temporizadores, controles de reproducción multimedia (como BarPlay), estado de builds o notificaciones de CI, monitores del sistema, lanzadores rápidos, cambio de cuenta o indicadores de notificaciones.

Como puedes llevar directamente a la barra de tareas los controles y estilos de tu propia app, creo que es casi la única biblioteca .NET que permite recrear este tipo de experiencia en Windows 11 ahora que los deskbands desaparecieron.


Enlaces

Tiene licencia MIT, y puedes empezar copiando los proyectos de ejemplo (Deskband11Lib.WinUI.Sample, Deskband11Lib.Wpf.Sample). Toda retroalimentación, issues y PR son bienvenidos. Si llegan a crear un widget interesante para la barra de tareas, avísenme.

2 comentarios

 
turtlehwan 4 시간 전

Oh, la idea está muy buena.

 
kck4156 4 시간 전

¡Gracias! La verdad, solo lo convertí en una librería, pero creo que fue gracias a la idea de quien lo hizo originalmente... jaja