Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CustomRes Pro

Gestor de resoluciones personalizadas y estiradas para Windows 11.

Detecta automáticamente la GPU, los monitores conectados y sus modos soportados, y aplica resoluciones —incluidas las estiradas para juego competitivo— con una red de seguridad que restaura la configuración anterior si algo sale mal.


Índice


Qué hace

Estado del sistema. Al arrancar detecta modelo y fabricante de GPU, versión del driver, resolución actual y nativa, frecuencia actual y soportadas, catálogo completo de modos, escalado de Windows por monitor, número de monitores, cuál es el principal y la relación de aspecto del panel.

Biblioteca de resoluciones. Aplicación en un clic de las resoluciones más usadas en juego, agrupadas por relación de aspecto: 16:9, 16:10, 4:3, 5:4 y ultrawide.

Stretched Resolutions. Sección dedicada a las resoluciones estiradas de juego competitivo, con selección del método de escalado y guía específica por fabricante.

Custom Resolution. Ancho, alto, frecuencia, relación de aspecto bloqueable y timing automático, con verificación previa en tiempo real contra las capacidades reales del monitor y la GPU.

Confirmación con cuenta regresiva. Toda resolución aplicada abre una ventana flotante con 10 segundos de cuenta atrás. Si no confirma, la resolución anterior vuelve sola.

Perfiles de juego. Una resolución por juego, con lanzamiento desde la aplicación y restauración automática al cerrar el juego. Detecta bibliotecas de Steam, Epic Games, Riot Games, Battle.net y Xbox.

Historial y favoritos. Registro de cada cambio con fecha, hora, método usado y resultado, restaurable en un clic. Y acceso rápido a las resoluciones marcadas como favoritas.

Diagnóstico. Registro en vivo y en archivo de la detección de hardware, cada método de aplicación probado y cada restauración automática.


Instalación

Instalador (recomendado)

Ejecute CustomResPro-1.0.0-Setup.exe. Incluye el runtime de .NET, así que no necesita instalar nada más.

El instalador crea el acceso directo en el menú Inicio, opcionalmente en el escritorio, y ofrece activar el inicio con Windows. El desinstalador se registra en Aplicaciones instaladas y pregunta si desea conservar sus perfiles y ajustes.

Versión portable

Descomprima publish\framework-dependent y ejecute CustomResPro.exe. Esta versión requiere el runtime de .NET 10 Desktop instalado.

Requisitos

Sistema Windows 11 o Windows 10 build 17763+
Arquitectura x64
GPU NVIDIA, AMD o Intel
Permisos Ninguno especial. Ver nota sobre Intel más abajo

La aplicación no requiere administrador para su uso normal. Sólo el ajuste de escalado por registro en gráficos Intel necesita elevación; si no la tiene, se omite y se usa la vía del sistema operativo, que funciona igual.


Uso

  1. Seleccione el monitor en el desplegable de la cabecera.
  2. Elija una resolución en Populares, Stretched o defínala en Custom Resolution.
  3. La resolución se aplica de inmediato y aparece la cuenta regresiva.
  4. Pulse Conservar resolución para dejarla, o Restaurar resolución anterior para deshacerla.

Si no hace nada durante 10 segundos, la resolución anterior vuelve automáticamente. Ese es el comportamiento por diseño: si la pantalla se ha quedado en negro no puede pulsar nada, y precisamente por eso se restaura sola.

El botón Restauración de emergencia de la barra lateral está disponible desde cualquier página y devuelve todos los monitores a la configuración que Windows tiene guardada.


Cómo aplica las resoluciones

Los drivers gráficos rechazan modos por motivos distintos, y ningún método funciona en todos los casos. CustomRes Pro prueba seis en cascada y se queda con el primero que funcione:

# Método Cuándo actúa
1 ChangeDisplaySettingsEx Siempre. Valida con CDS_TEST antes de aplicar
2 ChangeDisplaySettingsEx + CDS_ENABLE_UNSAFE_MODES Modos que el driver puede generar pero el EDID del monitor no publica
3 DisplayConfig / CCD (SetDisplayConfig) Cuando falla la API clásica; es también la vía para fijar el escalado
4 Específico NVIDIA GPU NVIDIA: escalado por CCD + reaplicación con CDS_RESET
5 Específico AMD GPU AMD: igual, con reintento espaciado —los drivers AMD rechazan cambios encadenados
6 Específico Intel GPU Intel: además escribe el DWORD Scaling del adaptador si hay permisos

Verificación real. Un método puede devolver «correcto» sin haber cambiado nada. Después de cada intento se relee el estado del adaptador y se comprueba que la resolución activa es la pedida (con ±1 Hz de tolerancia, porque los drivers redondean 59,94 Hz a 59 o 60). Si no coincide, se continúa con el siguiente método.

Todos los intentos, con su motivo de fallo, quedan en el registro y son visibles en Diagnóstico.


Resoluciones estiradas

Una resolución estirada es una resolución 4:3 o 5:4 mostrada a pantalla completa en un panel 16:9. Los modelos de los personajes se ven más anchos, que es lo que buscan muchos jugadores de CS2 y Valorant.

Para que funcione hacen falta dos cosas, no una:

  1. La resolución — la aplica CustomRes Pro.
  2. El modo de escalado en «pantalla completa» — CustomRes Pro lo fija por la API del sistema operativo, pero el panel de control del fabricante puede sobrescribirlo.

Si tras aplicar un preset la imagen sale con bandas negras a los lados, revise el ajuste del fabricante:

NVIDIA → Panel de control de NVIDIA → Pantalla → Ajustar tamaño y posición del escritorio → modo Pantalla completa, Realizar escalado en: GPU, y marcar Anular el modo de escalado establecido por juegos y programas.

AMD → AMD Software: Adrenalin Edition → Pantalla → activar Escalado de GPU y poner Modo de escalado en Pantalla completa.

Intel → Intel Graphics Command Center → Pantalla → General → Escala → Escalar pantalla completa.

Esta guía también está dentro de la aplicación, en la sección Stretched Resolutions.

Presets incluidos

Resolución Aspecto Nota
1440x1080 4:3 El estándar en CS2 y Valorant
1280x960 4:3 Muy popular desde CS 1.6, más FPS
1280x1024 5:4 El estirado más pronunciado
1152x864 4:3 Estirado ligero, menos carga de GPU
1024x768 4:3 Máximo rendimiento

Seguridad y recuperación

Cambiar a un modo que el monitor no puede mostrar deja la pantalla sin señal. La aplicación se diseñó asumiendo que eso va a pasar, y tiene cuatro capas de protección independientes:

1. Verificación previa. Antes de aplicar se comprueban rangos, existencia del modo en el catálogo del driver, límites físicos del panel y coherencia del escalado. Los errores bloquean; los avisos se muestran y se pide confirmación explícita.

2. Cuenta regresiva. La ventana de confirmación restaura sola al agotarse el plazo. No hace falta que el usuario vea nada.

3. Watchdog en hilo de fondo. Un temporizador independiente del hilo de interfaz salta 2 segundos después del plazo. Si el compositor de Windows se ha congelado y la ventana ni siquiera se puede dibujar, este mecanismo restaura llamando directamente a la API nativa. Sin él, un modo que bloquee la interfaz dejaría al usuario sin salida.

4. Centinela en disco. Antes de tocar el display se escribe pending-change.json con la configuración previa. Se borra al confirmar. Si la aplicación arranca y lo encuentra, significa que el último cambio nunca se confirmó —cierre inesperado, cuelgue o corte de luz— y restaura la configuración guardada antes de mostrar la ventana.

Además, si la aplicación lanza una excepción no controlada o se cierra con un cambio pendiente, se revierte antes de terminar.


Perfiles de juego

Un perfil asocia una resolución, frecuencia, escalado y monitor a un juego concreto.

Detección automática. Busca en Steam (libraryfolders.vdf + manifiestos .acf, incluidas bibliotecas en varios discos), Epic Games (manifiestos .item), Riot Games (RiotClientInstalls.json + metadatos), Battle.net (entradas de desinstalación de Blizzard) y Xbox (carpetas XboxGames).

Lanzamiento. Al pulsar Jugar, la resolución se aplica antes de arrancar el juego —muchos juegos leen el modo del escritorio al iniciarse y lo fijan para toda la sesión— y luego se lanza por el URI de la plataforma (steam://, battlenet://, com.epicgames.launcher://) cuando existe, que es lo que respeta la autenticación y el anticheat.

Restauración al salir. La aplicación vigila el proceso del juego y devuelve la resolución nativa al detectar que se ha cerrado. Como los lanzadores delegan y terminan enseguida, no basta con esperar al proceso que se creó: se sondea la lista de procesos buscando el ejecutable del juego, y se contempla el caso de los que se relanzan en dos fases por el anticheat.

Para que la restauración automática funcione, el perfil necesita el ejecutable asignado. Use Elegir ejecutable… en el editor del perfil.


Rendimiento

Medido en Release sobre la publicación framework-dependent:

Objetivo Medido
Inicio < 2 s 1,7 s hasta ventana visible
CPU en reposo < 1 % 0 %
RAM < 100 MB 75 MB de memoria privada · 128 MB de working set

Sobre la memoria: los 75 MB de memoria privada son lo que la aplicación consume realmente. El working set de 128 MB incluye además las páginas compartidas del runtime de WPF, que el sistema comparte con cualquier otra aplicación .NET en ejecución y no son coste exclusivo de este proceso.

Decisiones que sostienen estas cifras:

  • Registro en vez de WMI para detectar la GPU: WMI tarda entre 300 y 900 ms en el primer acceso.
  • Páginas bajo demanda: las nueve páginas se crean la primera vez que se abren, no al arrancar. Esto solo ahorró ~19 MB de memoria privada.
  • Sin contenedor de inyección de dependencias: el grafo se construye a mano, sin reflexión.
  • MVVM propio en lugar de un toolkit: evita cargar un ensamblado extra en el arranque.
  • Detección tras mostrar la ventana: la enumeración de modos ocurre en paralelo a que el usuario ya está viendo la interfaz.
  • Compactación al minimizar: se devuelven al sistema las páginas no usadas.

Arquitectura

src/CustomResPro/
├─ Interop/                     P/Invoke
│  ├─ NativeMethods.cs          ChangeDisplaySettingsEx, EnumDisplaySettingsEx, DPI
│  ├─ DisplayConfigApi.cs       API CCD: nombres, modo nativo, escalado
│  └─ NvApi.cs                  NVAPI de sólo lectura (versión de driver)
├─ Models/                      Tipos de dominio, inmutables donde procede
├─ Services/
│  ├─ Appliers/                 Los 6 métodos de aplicación
│  ├─ DisplayEnumerationService Descubrimiento de monitores y modos
│  ├─ GpuDetectionService       Detección de adaptadores
│  ├─ ResolutionApplyService    Orquestador con fallback y verificación
│  ├─ ValidationService         Verificación previa
│  ├─ RecoveryService           Instantáneas, centinela y restauración
│  ├─ GameDetectionService      Escaneo de las 5 plataformas
│  ├─ GameLaunchService         Lanzamiento y vigilancia del proceso
│  └─ DataServices.cs           Ajustes, perfiles, historial, favoritos
├─ Mvvm/                        ObservableObject, comandos, convertidores
├─ ViewModels/MainViewModel.cs  Estado compartido por todas las páginas
├─ Views/
│  ├─ MainWindow                Navegación y carga perezosa de páginas
│  ├─ ConfirmationWindow        Cuenta regresiva + watchdog
│  └─ Pages/                    Las 9 páginas
└─ Themes/                      Paleta y estilos Fluent

Por qué WPF y no WinUI 3. WinUI 3 requiere el workload de Windows App SDK, que añade una dependencia frágil de instalación y complica la distribución sin aportar nada que este caso de uso necesite. WPF sobre .NET 10 arranca antes, se publica autónomo sin fricción y permite un tema Fluent propio con control total.

Dónde se guardan los datos

%AppData%\CustomResPro\

Archivo Contenido
settings.json Preferencias
profiles.json Perfiles de juego
history.json Historial de cambios
favorites.json Resoluciones favoritas
pending-change.json Centinela de cambio sin confirmar (efímero)
logs\customres-AAAA-MM-DD.log Registro diario, purgado a los 14 días

Todas las escrituras JSON son atómicas (a .tmp y luego File.Replace), de modo que un corte de corriente a mitad de guardado nunca deja un archivo de perfiles corrupto.


Compilación

Requiere el SDK de .NET 10 y, para el instalador, Inno Setup 6 (winget install JRSoftware.InnoSetup).

# Cadena completa: compilar, publicar ambas variantes y generar el instalador
.\build.ps1

# Sin instalador
.\build.ps1 -SkipInstaller

Manualmente:

dotnet build CustomResPro.sln -c Release
dotnet publish src\CustomResPro\CustomResPro.csproj -c Release -r win-x64 --self-contained true -o publish\self-contained
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\CustomResPro.iss

Salidas en publish\: framework-dependent\ (0,5 MB), self-contained\ (131 MB) e installer\.

Pruebas

La aplicación incorpora dos modos de comprobación por línea de comandos. Ambos escriben un informe en %AppData%\CustomResPro\ y devuelven código de salida 0 si todo pasa.

# 47 comprobaciones. NO cambia la resolución en ningún momento.
# Cubre detección de hardware, catálogo de modos, verificación previa,
# biblioteca de presets, persistencia atómica y el ciclo completo de
# recuperación (centinela, restauración y confirmación).
CustomResPro.exe --selftest      # informe en selftest-report.txt

# Prueba de extremo a extremo CON cambio real de resolución.
# Aplica un modo estirado, muestra la cuenta regresiva, la deja expirar
# y comprueba que la resolución original vuelve sola.
# Altera la pantalla unos 12 segundos: no lo ejecute a ciegas.
CustomResPro.exe --livetest      # informe en livetest-report.txt

build.ps1 ejecuta --selftest automáticamente y aborta la compilación si algo falla. --livetest se deja fuera del pipeline a propósito, porque no puede correr desatendido.


Resolución de problemas

La resolución no se aplica. Abra Diagnóstico: verá cada método probado y por qué falló. El caso más común es que el modo no exista en el catálogo del driver; active Permitir modos no declarados por el monitor en Ajustes, o acepte el aviso que aparece al aplicarlo.

La imagen sale con bandas negras en vez de estirada. El escalado del fabricante está sobrescribiendo el del sistema. Siga la guía de Resoluciones estiradas.

La pantalla se quedó en negro. Espere 10 segundos: la resolución anterior vuelve sola. Si no ocurre, el watchdog actúa 2 segundos después. Si aun así no se recupera, reinicie el equipo: al volver a abrir la aplicación, el centinela en disco detecta el cambio sin confirmar y restaura la configuración previa.

Un juego no aparece en la detección. Cree un perfil manual con + Perfil manual y asigne el ejecutable con Elegir ejecutable….

La resolución no vuelve al cerrar el juego. El perfil necesita el ejecutable asignado para poder vigilar el proceso. Sin él, la aplicación lo advierte en el registro al lanzar.


Limitaciones conocidas

Resoluciones superiores a la nativa requieren DSR (NVIDIA) o VSR (AMD) activados en el driver. La aplicación las detecta y avisa, pero no puede activar esas funciones: no hay API pública para ello.

El ajuste «Realizar escalado en: GPU» de NVIDIA vive en una base de datos binaria interna del driver sin API documentada. La aplicación fija el escalado por la vía soportada (CCD) e indica al usuario dónde está el ajuste del fabricante en lugar de manipular esa base de datos a ciegas.

NVAPI se usa sólo en modo lectura (versión del driver, nombre del chip). Las funciones de escritura de NVAPI se resuelven por ordinal y un marshalling incorrecto provoca una violación de acceso que tumbaría el proceso; no compensa el riesgo cuando la vía del sistema operativo cubre el caso.

La detección de Xbox cubre los juegos instalados en las carpetas XboxGames, que es la ubicación por defecto. El contenido de WindowsApps no es legible sin permisos especiales.

Un solo perfil vigilado a la vez. Lanzar un segundo juego desde la aplicación reemplaza la vigilancia del primero.


Licencia

MIT. Ver LICENSE.txt.

About

Gestor de resoluciones personalizadas y estiradas para Windows 11 con confirmacion automatica y recuperacion ante fallos

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages