Utilidades de Windows desde la bandeja del sistema, pensadas para ir creciendo con más funciones. Al hacer clic en el ícono se despliega, junto al cursor, un panel flotante moderno.
- Mantener despierto (switch principal: gris = inactivo, azul = activo): evita la
suspensión / hibernación del sistema y que se apague la pantalla
(API Win32
SetThreadExecutionState). - Duración: Indefinido, 30 min, 1 h o 2 h. Al cumplirse, se desactiva solo.
- Iniciar con Windows: arranca al iniciar sesión (registro
Rundel usuario). - Salir: restaura el comportamiento de energía normal y cierra la app.
- Deslizador (0–100 %) que oscurece el monitor donde se abre el panel. Cada monitor guarda su propio nivel; el deslizador refleja/controla el del monitor actual.
- Combina dos mecanismos para cubrir el mayor número de casos:
- una superposición negra semitransparente, click-through (deja pasar el ratón) y sin foco, que se mantiene siempre al frente (se reafirma de forma continua, así que también atenúa video/juegos en ventana o borderless y otras apps siempre-visibles);
- una rampa de gamma del adaptador que oscurece además lo que una ventana no puede cubrir: apps a pantalla completa (incluida la exclusive fullscreen de muchos juegos).
- La atenuación persiste aunque cierres el panel; vuelve a 0 % o usa Salir para quitarla (al salir se restaura la gamma original del monitor).
- Salvedades de la parte de gamma: no tiene efecto con HDR activado, afecta al color global del monitor y su oscurecimiento es limitado (Windows acota la rampa). Por eso, con niveles altos, el propio panel y la bandeja también se ven algo más tenues.
- Atajos del sistema (funcionan con cualquier app en primer plano). Se reasignan desde la
ventana de Preferencias (botón en el panel): clic en un atajo y pulsa la nueva
combinación. También editables en
%APPDATA%\Smart Menu\config.json. Por defecto:- Ctrl+Alt+K — activar/desactivar Mantener despierto.
- Ctrl+Alt+S — mostrar/ocultar el panel.
- Ctrl+Alt+V — abrir el historial de portapapeles.
- Ctrl+Alt+↑ / Ctrl+Alt+↓ — subir/bajar la atenuación del monitor bajo el cursor.
- Guarda los últimos N elementos copiados (texto e imágenes), accesible desde el panel ("Abrir historial") o con su hotkey. Elegir un elemento lo vuelve a copiar; con Auto-pegar activado, además lo pega (Ctrl+V) en la app donde estabas.
- Dentro del propio historial puedes activar/desactivar Auto-pegar y ajustar la profundidad (5–200) con un deslizador.
- Persiste entre reinicios en
%APPDATA%\Smart Menu(texto en JSON, imágenes en PNG). Sin duplicados: volver a copiar algo lo mueve arriba.
- Clic izquierdo o derecho en el ícono de la bandeja → abre el panel junto al cursor.
- El ícono es el logo de la app: a color cuando Keep Awake está activo y en gris cuando está inactivo. El tooltip también indica el estado.
- Construido con PySide6 (Qt): aparece con animación (fade + slide), switches animados,
esquinas redondeadas y sombra; sigue el tema claro/oscuro del sistema y se oculta al hacer
clic fuera (o con
Esc). - Una sola instancia a la vez (mutex con nombre).
- Windows 10/11 + Python 3.10 o superior (probado con 3.14).
- Dependencias (declaradas en
pyproject.toml):PySide6(UI/animaciones y bandeja) yPillow(genera el ícono);pyinstallersolo para empaquetar (extrabuild). Hotkeys y portapapeles usan soloctypes/Qt, sin dependencias extra.
# Dependencias (elige una opción):
python -m pip install -r requirements.txt # rápido (incluye PyInstaller)
python -m pip install -e ".[build]" # desde pyproject.toml; añade el comando `smart-menu`
# Ejecutar (sin ventana de consola):
pythonw -m smart_menu
# Depuración (con logs en consola):
python -m smart_menu(También: python run.py, o el comando smart-menu si instalaste con pip install -e.)
Los recursos viven en assets/: logo.png es la imagen de la app e icon.ico (generado a
partir de ella) es el ícono del ejecutable.
./build.ps1Genera dist\Smart Menu.exe (un solo archivo, sin consola). Internamente: instala
dependencias, crea assets/icon.ico desde assets/logo.png y ejecuta PyInstaller con
Smart Menu.spec (empaqueta PySide6/Qt vía sus hooks e incluye la carpeta assets/).
Nota: al incluir Qt, el
.exees bastante más grande (~55 MB) y el arranque onefile puede ser algo más lento. Se desactiva UPX en el.spec(comprimir DLLs de Qt puede dar problemas). Alternativa para arrancar más rápido: pasar a--onedir(COLLECT) en el.spec.
-
Ejecuta la app, abre el panel y activa el switch Mantener despierto.
-
En una consola como administrador:
powercfg /requestsDebe aparecer el proceso bajo SYSTEM y bajo DISPLAY. Al desactivar, desaparecen.
-
Iniciar con Windows: tras activar ese switch,
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v SmartMenu
debe mostrar el valor; al desactivarlo, desaparece.
-
Salir restaura la energía: después,
powercfg /requestsno lista el proceso. -
Hotkeys: con otra app en primer plano, prueba Ctrl+Alt+S (panel), Ctrl+Alt+K (alterna Keep Awake) y Ctrl+Alt+V (historial de portapapeles).
-
Portapapeles: copia varios textos/imágenes, abre el historial y elige uno (se copia; con auto-pegar, se pega en la app previa). Reinicia la app: el historial persiste.
Smart Menu/
├─ smart_menu/ # paquete con el código fuente
│ ├─ __init__.py
│ ├─ __main__.py # permite `python -m smart_menu`
│ ├─ app.py # App PySide6 (panel animado) + cableado + main()
│ ├─ resources.py # acceso a assets/ (logo, íconos tintados, icon.ico)
│ ├─ widgets.py # widgets con animación (switch, control segmentado)
│ ├─ tray.py # ícono de bandeja (QSystemTrayIcon)
│ ├─ power.py # PowerController: energía + hilo + temporizador
│ ├─ dimmer.py # atenuación por monitor (superposición Qt + gamma)
│ ├─ gamma.py # rampa de gamma por dispositivo (pantalla completa)
│ ├─ winutil.py # utilidades Win32 (estilos de ventana, gamma, auto-pegar)
│ ├─ startup.py # iniciar con Windows (registro Run, valor SmartMenu)
│ ├─ hotkeys.py # hotkeys globales (RegisterHotKey + filtro de eventos Qt)
│ ├─ clipboard.py # historial de portapapeles (texto/imagen) + popup
│ ├─ preferences.py # ventana de Preferencias (reasignar hotkeys)
│ └─ config.py # ajustes en %APPDATA%\Smart Menu\config.json
├─ assets/ # recursos: logo.png, icon.ico e íconos de botones (PNG)
├─ run.py # lanzador (python run.py / entrada de PyInstaller)
├─ pyproject.toml # metadatos del paquete (nombre, versión, dependencias)
├─ LICENSE # GNU GPL v3 (o posterior)
├─ Smart Menu.spec # configuración de PyInstaller
├─ build.ps1 # empaquetado a .exe
└─ requirements.txt # dependencias (reflejan pyproject, para build.ps1)
- No requiere privilegios de administrador para funcionar.
- Todo corre en el hilo principal (Qt); el controlador de energía usa un hilo trabajador que avisa a la interfaz mediante una señal Qt.
- Tanto el clic izquierdo como el derecho abren el panel; no hay menú nativo de Windows.
- Si cierras el proceso de cualquier modo, Windows libera el bloqueo de energía (y la gamma se restaura al cerrar sesión).
- Autor: Iván Ramírez.
- Licencia: GNU General Public License v3.0 o posterior (
GPL-3.0-or-later). El texto completo está enLICENSE.



