Skip to content

Darojax/SecondaryMonitorStutterFix

Repository files navigation

Secondary Monitor Stutter Fix

Showcase

Current release: 1.0.3

Secondary Monitor Stutter Fix is a small Windows tray application for a specific Desktop Window Manager problem: video or desktop motion on a secondary monitor can look visibly uneven even though the player is presenting frames at the correct rate. In the system for which this was developed, the affected 59.95 Hz display became smooth when made primary, and this workaround restores most or all of that smoothness while it remains secondary.

This is a DWM composition workaround. It is not a video filter, frame interpolator, driver modification, or monitor-mode switcher.

How the workaround works

For every selected monitor, the application maintains a tiny, borderless, click-through window at 1% opacity and continuously changes its rendered contents. This keeps a genuinely changing composition surface attached to that output and prevents the DWM behavior associated with the stutter.

The recommended configuration is selected by default:

  • one 200×10 surface per monitor;
  • 120 Hz requested cadence;
  • synchronized scheduling disabled.

The cadence is a scheduling request, not a claim about physical scan-out. Windows may deliver a slower interval; the settings window reports the interval actually achieved.

Origin and credit

The core workaround concept came from the MIT-licensed Arccalc/Dwmfix project. That project demonstrated that a nearly transparent animated window on a secondary display can prevent the problematic DWM behavior.

DWMfix already supports running the workaround on multiple monitors. This application independently reimplements the mechanism in C#/.NET and extends its monitor handling with persistent hardware-based display identities, reconnection support, and automatic recovery. It also provides selectable rendering modes and cadences, tray operation, launch-at-login support, diagnostics, and a conventional per-user installer. It does not include the upstream updater or unrelated functionality.

The upstream copyright and MIT license are reproduced in THIRD-PARTY-NOTICES.md.

Install

The distributable files are under release:

  1. Exit any older Secondary Monitor Stutter Fix instance from its tray menu.
  2. Run SecondaryMonitorStutterFix-Setup-1.0.3.exe.
  3. Select one or more target monitors.
  4. Leave Standard, 120 Hz, and synchronized scheduling off unless testing indicates otherwise.
  5. Enable Start automatically when I sign in if desired.

Installation is per-user under %LOCALAPPDATA%\Programs\SecondaryMonitorStutterFix and does not require administrator privileges. The installer is self-contained for 64-bit Windows, so the destination machine does not need to have .NET 8 installed separately. The application appears normally in Windows Installed Apps and can be removed from there.

Automatic startup uses a shortcut in the current user's Startup folder. It does not use Task Scheduler, a service, or an administrator-level mechanism.

Everyday operation

  • Multiple monitors can be enabled simultaneously.
  • Closing the settings window hides it in the notification area; it does not stop the fix.
  • Exit in the tray menu stops the application and removes all surfaces.
  • Display changes, resume, session unlock, and a stalled rendering surface trigger automatic recovery.
  • Monitor selection is stored by persistent display-interface identity rather than a changeable DISPLAY1/DISPLAY2 number.
  • Settings and logs are stored under %LOCALAPPDATA%\SecondaryMonitorStutterFix.

The tray menu provides enable/disable, settings, surface restart, data-folder access, and exit commands.

What it does not do

The application does not:

  • change HAGS, refresh rates, display topology, drivers, or registry settings;
  • inject code into players or games;
  • request that the display or computer remain awake;
  • require administrator privileges;
  • access the network or update itself.

Trade-offs

The technique intentionally keeps a DWM-composed surface changing on each selected output. This can slightly increase DWM, GPU, and timer activity and may prevent presentation optimizations that depend on an idle output. The standard surface is deliberately tiny to keep that cost modest.

This is a targeted workaround for an observed Windows composition behavior, not a universal solution for dropped frames or decoding problems.

Build and test

Requirements: Windows and the .NET 8 SDK.

dotnet build -c Release
dotnet run -c Release
dotnet run -c Release -- --self-test

Launching the application while it is already running reopens the existing settings window instead of starting another instance.

The self-test discovers every connected display, verifies unique persistent identities, creates one surface on each monitor, renders ten frames, and cleans up.

The installer is defined in packaging\SecondaryMonitorStutterFix.iss and is compiled with Inno Setup 6. The application icon source and deterministic icon builder are retained under assets and tools\IconBuilder.

The distributable payload is published self-contained before compiling the installer:

dotnet publish -c Release -r win-x64 --self-contained true -o .\artifacts\portable-v1.0.3

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors