De la idea al código: construyendo un stock ticker corporativo para Windows 11

En uno de nuestros clientes surgió una petición muy particular: un ticker de acciones que aparezca siempre visible en la barra de tareas de Windows 11, mostrando el valor actualizado de la acción junto con información clave de negocio.

A primera vista parece algo trivial —“que salga en la taskbar”—, pero en la práctica Windows 11 no permite inyectar texto arbitrario dentro de la barra. La única manera oficial de extenderla es mediante widgets (que viven en el panel de widgets, no en la taskbar), o con íconos en la bandeja del sistema (system tray).

El reto

  • El cliente pedía que fuera siempre visible.
  • Que mostrara texto claro con precio y variación, no solo un ícono.
  • Que fuera ligero, corporativo, y desplegable en cientos de equipos vía Intune.

Eso nos obligó a explorar soluciones más allá de los widgets.

Opciones evaluadas

  1. Widget oficial de Windows 11
    ✅ Integración con Adaptive Cards y Windows App SDK
    ❌ Solo vive en el panel de Widgets (Win+W), no siempre visible.
  2. System Tray Icon
    ✅ Soportado nativamente, estable.
    ❌ Espacio muy reducido para texto, se vuelve solo tooltip.
  3. Overlay flotante tipo ticker (la solución elegida)
    ✅ Ventana sin bordes, transparente, siempre arriba, anclada junto al reloj.
    ✅ Permite texto claro (“ALSEA 42.15 MXN ▲1.2%”).
    ✅ Distribuible como cualquier aplicación de escritorio (MSIX + Intune).
    ❌ No está “dentro” de la taskbar, aunque visualmente lo parece.

Prototipo en Python

Como experimento inicial, usamos pystray + yfinance para poner el precio en el tray icon. El código era tan simple como:

import pystray, time, threading, yfinance as yf
from pystray import Icon, MenuItem
from PIL import Image, ImageDraw

def get_price():
    data = yf.Ticker("ALSEA.MX").history(period="1d")
    return data["Close"].iloc[-1] if not data.empty else None

def create_image(price):
    img = Image.new('RGB', (64, 64), "white")
    draw = ImageDraw.Draw(img)
    draw.text((5, 25), f"${price:.2f}", fill="black")
    return img

def update_icon(icon):
    while True:
        price = get_price()
        icon.icon = create_image(price or 0.0)
        icon.title = f"ALSEA: ${price:.2f}" if price else "Error"
        time.sleep(1500)  # 25 min

Esto sirvió para validar la idea, pero no resolvía el punto clave: texto legible en la barra.

🪟 La solución final: overlay en WPF / WinUI 3

Decidimos crear una mini-app overlay que se comporta como una franja pegada a la barra de tareas:

  • WPF versión: más simple, soporta transparencias per-pixel.
  • WinUI 3 versión: más moderno, con soporte de Windows App SDK.

WPF

<Window ... Width="260" Height="28"
    WindowStyle="None" AllowsTransparency="True"
    Topmost="True" ShowInTaskbar="False">
    <Border CornerRadius="6" Background="#AA000000" Padding="10,4">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="ALSEA" Foreground="White"/>
            <TextBlock x:Name="Price" Text="42.15 MXN" Foreground="White"/>
            <TextBlock x:Name="Delta" Text="▲1.2%" Foreground="Lime"/>
        </StackPanel>
    </Border>
</Window>

WinUI 3

_appWindow.Resize(new SizeInt32(260, 28));
int width  = _appWindow.Size.Width;
int height = _appWindow.Size.Height;

int x = area.X + area.Width  - width  - 230;
int y = area.Y + area.Height - height - 6;
SetWindowPos(_hwnd, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);

Con esta técnica, la ventana se ancla justo antes del reloj, siempre arriba y sin robar foco. Visualmente parece parte de la taskbar.

Integración de precios

Para la demo usamos un MockPriceFeed que simula variaciones. En producción se reemplaza con un IPriceFeed conectado a un proveedor bursátil autorizado (BMV, Bloomberg, Refinitiv, etc.).

public interface IPriceFeed {
    Task<Quote> GetAsync(string symbol);
}

Distribución corporativa

  • Empaquetamos en MSIX firmado.
  • Distribución vía Intune/Endpoint Manager.
  • Scripts de PowerShell para crear una tarea programada al iniciar sesión.
Register-ScheduledTask -TaskName "AlseaTicker"
  -Action (New-ScheduledTaskAction -Execute "C:\AlseaTicker.exe")
  -Trigger (New-ScheduledTaskTrigger -AtLogOn)

Conclusión

Aunque Windows 11 no permite modificar directamente la barra de tareas, un overlay bien diseñado cumple el objetivo de negocio:

  • Información siempre visible.
  • Ligero y corporativo.
  • Distribuible en entornos de empresa.

Este caso demuestra cómo, con un poco de creatividad y conocimiento de WPF / WinUI 3 + APIs Win32, se pueden lograr soluciones que parecen imposibles en la plataforma.

Cheers!

Recent Comments

No comments to show.