Screen Health Guardian
Aplicación de escritorio nativa y ultraligera para Windows que promueve la salud visual y postural monitoreando la actividad real del usuario con soporte multimonitor.
El Problema
Fatiga visual y sobrecarga postural tras largas horas continuas frente a la pantalla, sumado a las limitaciones de herramientas empaquetadas en Python (PyInstaller) que generaban falsos positivos en antivirus y falta de cobertura multimonitor.
La Solución
Una aplicación de escritorio nativa en C# y .NET 9 con WPF y aceleración por GPU que actúa como un servicio ultraligero en la bandeja del sistema (12–16 MB RAM, <0.1% CPU), detecta inactividad con Win32 GetLastInputInfo y proyecta overlays translúcidos configurables en múltiples monitores para descansos visuales (regla 20-20-20) y postura.
Aprendizajes Clave
- Soporte Multimonitor y Composición DWM: Proyección sincronizada y configurable de ventanas de alerta traslúcidas en todas las pantallas activas con escalado DPI mixto independiente.
- Evolución Arquitectónica (Python ➡️ C# / .NET): Eliminación total de falsos positivos en Windows Defender al reemplazar PyInstaller con ejecutables nativos compilados en .NET 9.
- Optimización de Recursos en Daemons Residentes: Reducción del uso continuo de RAM de ~50 MB a solo 12–16 MB y reducción del consumo de CPU por debajo del 0.1% mediante DispatcherTimer nativo sin contención de GIL.
- Integración Nativa con el Sistema Operativo: Sustitución de locks por sockets TCP por un System.Threading.Mutex nativo de Win32 y desacoplamiento del System Tray mediante H.NotifyIcon.Wpf.
Arquitectura Nativa de Escritorio (.NET 9 / WPF)
Screen Health Guardian fue reescrito desde cero en C# y .NET 9 tras superar las limitaciones de consumo y falsos positivos heurísticos asociados a empaquetadores como PyInstaller:
- Daemon Ultraligero en System Tray: Opera en segundo plano con una huella de memoria de 12–16 MB de RAM y menos del 0.1% de CPU, utilizando
H.NotifyIcon.Wpfy un mutex global de Win32 para ejecución de instancia única. - Detección de Inactividad con Win32: Llamada P/Invoke a
GetLastInputInfopara pausar contadores automáticamente si el usuario se retira del escritorio, asegurando que solo se contabilice el tiempo de exposición visual activa.
Soporte Multimonitor y Composición DWM
- Overlays Translúcidos con Aceleración GPU: Renderizado simultáneo de alertas visuales sincronizadas en todas las pantallas detectadas mediante
Screen.AllScreens, adaptándose a configuraciones de DPI mixto y orientación vertical/horizontal. - Evolución Arquitectónica Python → C#/.NET: La migración desde un prototipo PyInstaller eliminó completamente los falsos positivos en Windows Defender, redujo la huella de RAM de ~50 MB a 12–16 MB y eliminó la contención del GIL en bucles de temporizador de alta frecuencia.
Nota: Puedes descargar el instalador standalone
.exeo el binario sin dependencias directamente desde la sección de Releases en GitHub.