[BUG] Claude Desktop App — Screen Flickering & Mouse Lag on Windows

Status Closed — not planned
Maintainer reply None cached
Activity 10 comments · opened May 6, 2026 · closed May 9, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

Bug Report: Claude Desktop App — Screen Flickering & Mouse Lag on Windows

Summary

Claude Desktop application causes screen flickering and mouse input lag (stuttering) when moving the cursor over the application window on Windows. The issue is related to Electron GPU compositing and DWM interaction, particularly on multi-GPU desktop systems.

Environment

  • OS: Windows 11 (fresh install, latest updates)
  • CPU: AMD Ryzen 9 9950X 16-Core (with integrated AMD Radeon Graphics)
  • dGPU: NVIDIA GeForce RTX 5070 Ti (Driver 596.36, CUDA 13.2)
  • iGPU: AMD Radeon Graphics (Ryzen integrated)
  • RAM: 128 GB
  • Monitor: Dell S2716DG, 2560x1440 @ 144Hz, connected via DisplayPort to RTX 5070 Ti
  • Motherboard: MSI MS-7E49 (X870E)
  • Claude Desktop Version: 1.6259.1.0 (Microsoft Store)

Steps to Reproduce

  1. Install Claude Desktop from Microsoft Store on a system with dual GPUs (integrated + discrete)
  2. Launch Claude Desktop
  3. Move the mouse cursor over the Claude application window
  4. Observe: screen flickering and mouse cursor stuttering/lag

Expected Behavior

Smooth cursor movement and no screen flickering when interacting with the application window.

Actual Behavior

  • Rapid screen flickering when hovering/moving mouse over the Claude window
  • Mouse cursor stutters and lags during movement over the application
  • GPU utilization spikes to 15-20% on NVIDIA GPU just from mouse movement over the window
  • DWM (Desktop Window Manager) utilization reaches 34% on the GPU during window interaction

Root Cause Analysis

The issue stems from Electron's GPU compositing layer interacting with Windows DWM on multi-GPU desktop systems:

  1. DWM binds to the GPU owning the display output. On desktops with the monitor connected to the discrete GPU (NVIDIA), DWM must composite all windows on that GPU.
  1. Electron GPU compositing causes excessive redraws. When the mouse moves over the Claude window, the Electron renderer triggers continuous frame repaints. DWM then re-composites these frames on the NVIDIA GPU, creating a bottleneck.
  1. Cross-GPU frame transfer (if iGPU is used for rendering). When Claude is set to render on the integrated AMD GPU while DWM runs on NVIDIA, frames must be copied between GPUs, adding latency and causing visible stuttering.
  1. The issue does NOT occur on Linux (Ubuntu), where the Wayland/X11 compositor handles GPU offload rendering natively via PRIME/DMA-BUF without forcing all UI processes onto the discrete GPU.

Workaround Found

Launching Claude Desktop with the --disable-gpu-compositing flag resolves both the flickering and mouse lag:

"C:\Program Files\WindowsApps\Claude_1.6259.1.0_x64__pzs8sxrjxfjjc\app\Claude.exe" --disable-gpu-compositing

This forces Claude to use software compositing (CPU-based), which eliminates the DWM/GPU compositing conflict. With a modern CPU (Ryzen 9 9950X), there is no noticeable performance impact for a text-based application.

Suggested Fix

  1. Add a "Disable Hardware Acceleration" toggle in Claude Desktop Settings (like Chrome, VS Code, Discord, and other Electron apps provide).
  1. Auto-detect multi-GPU configurations and default to software compositing or use --disable-gpu-compositing automatically on desktop systems with multiple GPUs.
  1. Alternatively, pass --disable-gpu-compositing by default on Windows for the Claude Desktop app, since it is primarily a text-based interface and does not benefit from GPU compositing.

Additional Notes

  • Claude Desktop spawns 12 processes consuming ~2 GB of RAM total
  • The --disable-gpu flag also resolves the issue but is more aggressive than necessary
  • Setting GpuPreference=1 (Power Saving / iGPU) or GpuPreference=2 (High Performance / dGPU) in Windows Graphics Settings does not resolve the issue — only disabling GPU compositing helps
  • The BIOS "Hybrid GPU" option on the MSI motherboard does not change DWM behavior on Windows (unlike NVIDIA Optimus on laptops)

Reporter

  • Date: 2026-05-07
  • System: Desktop workstation (MSI X870E / Ryzen 9 9950X / RTX 5070 Ti)

What Should Happen?

The Claude Desktop application should render its window smoothly without screen flickering or mouse cursor lag when moving the mouse over the application window. On a system with dual GPUs (integrated AMD Radeon + discrete NVIDIA RTX 5070 Ti), the app should either:

  1. Provide a "Disable Hardware Acceleration" toggle in Settings (like Chrome, VS Code, Discord do)
  2. Auto-detect multi-GPU desktop configurations and default to software compositing
  3. Or pass --disable-gpu-compositing by default, since Claude is a text-based app and does not benefit from GPU compositing

Currently the only workaround is launching with --disable-gpu-compositing flag manually via a custom shortcut.

Error Messages/Logs

Steps to Reproduce

  1. Install Claude Desktop from Microsoft Store on a Windows 11 system with dual GPUs (integrated AMD Radeon iGPU + discrete NVIDIA GPU), monitor connected to the discrete GPU
  2. Launch Claude Desktop normally (without any custom flags)
  3. Move the mouse cursor over the Claude application window
  4. Observe: screen flickering and mouse cursor stuttering/lag
  5. Additionally, open Task Manager → Performance → GPU: notice NVIDIA GPU utilization spikes to 15-20% just from mouse movement over the window, DWM reaches up to 34%

Workaround: launching Claude with --disable-gpu-compositing flag eliminates the issue completely.

Claude Model

None

Is this a regression?

I don't know

Last Working Version

_No response_

Claude Code Version

N/A (this is a Claude Desktop issue, not Claude Code) Claude Desktop Version: 1.6259.1.0 (Microsoft Store)

Platform

Anthropic API

Operating System

Windows

Terminal/Shell

Other

Additional Information

_No response_

View original on GitHub ↗

10 Comments

github-actions[bot] · 5 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/31990
  2. https://github.com/anthropics/claude-code/issues/26302
  3. https://github.com/anthropics/claude-code/issues/42045

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

github-actions[bot] · 5 months ago

Closing for now — this doesn't appear to be about Claude Code. Please open a new issue if this is still relevant.

iwata-1116 · 4 months ago

Workaround confirmed — plus the missing piece: how to pass --disable-gpu-compositing to the MSIX (Microsoft Store) build.

⚠️ This is an unofficial, temporary workaround. It relies on undocumented launch behavior of the packaged build, so a future Claude / Electron update may change this and break the method (or, hopefully, make it unnecessary). Use at your own risk.

Same root cause here (NVIDIA dGPU + high-refresh display, DWM ↔ Electron GPU-compositing). --disable-gpu-compositing removes the mouse / view-switch stutter for me too.

The open problem in this thread was how to pass the flag to the Store/MSIX build — it ignores normal CLI args, and launching the exe directly fails (no package identity). Solution: launch the packaged app via IApplicationActivationManager::ActivateApplication, passing the flag as the activation arguments. Those arguments land on the process command line, so Chromium reads the switch and propagates it to the renderers. (--remote-debugging-port is separately blocked and makes the app exit, but --disable-gpu-compositing is accepted and persists.)

$Aumid = 'Claude_pzs8sxrjxfjjc!Claude'   # confirm via:  Get-StartApps | ? Name -eq 'Claude'
Add-Type -TypeDefinition @'
using System; using System.Runtime.InteropServices;
[ComImport, Guid("2E941141-7F97-4756-BA1D-9DECDE894A3D"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IApplicationActivationManager {
    int ActivateApplication([In] string appUserModelId, [In] string arguments, [In] int options, [Out] out uint processId); }
[ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")] public class ApplicationActivationManager { }
public static class L { public static uint Go(string a,string b){ var m=(IApplicationActivationManager)(new ApplicationActivationManager()); uint p; m.ActivateApplication(a,b,0,out p); return p; } }
'@
# Quit Claude first (single-instance lock), then:
[L]::Go($Aumid, '--disable-gpu-compositing')

Verify it stuck:

Get-CimInstance Win32_Process -Filter "Name='Claude.exe'" | ? CommandLine -match 'disable-gpu-compositing'

Wrap it in a .ps1 + a shortcut (pwsh -WindowStyle Hidden -File ...) and launch Claude from that instead of the Store tile (also disable launch-at-login so it doesn't start without the flag).

Env: RTX 3070, 3440×1440@120 Hz ultrawide, Win11, Claude 1.8555.2.0 (Store). A built-in "disable GPU compositing / hardware acceleration" toggle in Settings would remove the need for this.

ReconGrunt · 4 months ago

Update-proof workaround (handles the MSIX packaging gotcha)

The --disable-gpu-compositing flag fixes this, but the raw command above breaks on every app update because the path is version-numbered (Claude_1.6259.1.0_... changes each release), and pointing a normal .lnk at the inner Claude.exe can silently drop the argument — MSIX-packaged apps only reliably receive command-line args via the Windows Application Activation Manager.

Here's a self-contained launcher that resolves the app dynamically (survives updates) and passes the flag correctly. Save as Launch-ClaudeNoFlicker.ps1:

$ErrorActionPreference = 'Stop'
$pkg = Get-AppxPackage -Name 'Claude' | Select-Object -First 1
if (-not $pkg) { Write-Error 'Claude desktop app not installed.'; exit 1 }
$appId = (Get-AppxPackageManifest $pkg).Package.Applications.Application |
         Select-Object -First 1 -ExpandProperty Id
$aumid = "$($pkg.PackageFamilyName)!$appId"
Add-Type -TypeDefinition @"
using System; using System.Runtime.InteropServices;
namespace ClaudeNoFlicker {
  [ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  public interface IApplicationActivationManager {
    int ActivateApplication([In] string appUserModelId,
      [In, MarshalAs(UnmanagedType.LPWStr)] string arguments, [In] uint options, [Out] out uint processId);
  }
  [ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")] public class ApplicationActivationManager {}
  public static class Launcher {
    public static uint Activate(string aumid, string args) {
      var mgr = (IApplicationActivationManager)new ApplicationActivationManager();
      uint pid; mgr.ActivateApplication(aumid, args, 0, out pid); return pid;
    }
  }
}
"@
[ClaudeNoFlicker.Launcher]::Activate($aumid, '--disable-gpu-compositing') | Out-Null

Then make a shortcut targeting:

powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<path>\Launch-ClaudeNoFlicker.ps1"

Verified: the flag propagates all the way to the renderer processes (--type=renderer ... --disable-gpu-compositing), confirming Electron honors it. Tested on Windows 11 with an NVIDIA dGPU.

Would be great if the app shipped a hardware-acceleration toggle (or defaulted this flag on affected NVIDIA/DWM configs) so users don't need a launcher. This issue has been going on for over 4 months and is a hassle to manage. Constant flickering is making it very difficult to use the Claude Desktop app.

VanditGupta · 4 months ago

Yes, facing this issue with a very similar setup.

OS — Windows 11 Pro
CPU — AMD Ryzen 7 9800X3D (with AMD integrated graphics)
GPU — MSI RTX 5070 Ti Ventus 3X OC (discrete)
Motherboard — Gigabyte B850 Gaming X WiFi6E
Monitor — LG 27GX700A-B 2560x1440 @ 280Hz connected via DisplayPort to RTX 5070 Ti
Claude Desktop Version — 1.11187.4.0 (MSIX/Microsoft Store package)

Note: The issue is not happening when using Light mode

VanditGupta · 4 months ago

Got the following error messages in terminal when trying to run the applicaiton with --disable-gpu-composting flag

PS C:\WINDOWS\system32> Start-Process "C:\Program Files\WindowsApps\Claude_1.11187.4.0_x64__pzs8sxrjxfjjc\app\claude.exe" --disable-gpu-compositing
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> eprecationWarning: url.parse() behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for url.parse() vulnerabilities.
PS C:\WINDOWS\system32> recation ...` to show where the warning was created)
PS C:\WINDOWS\system32> RROR:net\disk_cache\cache_util_win.cc:25] Unable to move the cache: Access is denied. (0x5)
PS C:\WINDOWS\system32> RROR:net\disk_cache\disk_cache.cc:284] Unable to create cache

iwata-1116 · 4 months ago

@VanditGupta — no worries, that error is expected with the way it was launched, and it's the exact case my earlier comment was about.

What went wrong (in plain terms): you started the app's .exe file directly. A Store (MSIX) app launched that way runs without its package identity, so it loses permission to its own cache folder — that's what these lines mean:

ERROR:net\disk_cache\cache_util_win.cc:25] Unable to move the cache: Access is denied. (0x5)
ERROR:net\disk_cache\disk_cache.cc:284] Unable to create cache

The fix: don't run the .exe yourself. Instead, ask Windows to launch the app by its app ID and hand it the flag — that keeps the package identity and delivers the flag. The script below does that for you.

Setup (step by step)

  1. Save the script below to a file named Launch-ClaudeSmooth.ps1 (anywhere you like, e.g. C:\Users\<username>\.local\bin\).
  2. Create a shortcut on your Desktop (right-click Desktop → New → Shortcut), and for the location/target paste this single line:

``
"C:\Program Files\PowerShell\7\pwsh.exe" -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Users\<username>\.local\bin\Launch-ClaudeSmooth.ps1"
``

  1. Launch Claude from that shortcut instead of the Start menu / Store tile. Also turn off "launch at login" so it never starts without the flag.

Notes / please read before trying:

  1. This works in my environment (Japanese edition of Windows). I haven't tested it on other language editions, so no guarantees there.
  2. Replace <username> with your actual Windows username, i.e. your real folder path. You can find it in File Explorer (the C:\Users\... folder for your account).
  3. The idea is: make a Desktop shortcut and set its target/location to the [command in step 2].
  4. The example paths may differ on your machine. Please check your own paths and adjust them before running.

The script

# Launch Claude Desktop (MSIX / Microsoft Store) with --disable-gpu-compositing.
# Fixes mouse/redraw stutter (DWM <-> Electron GPU compositing) on NVIDIA + high-refresh displays.
# The MSIX build ignores Chromium flags on a normal launch, so we pass them via
# IApplicationActivationManager::ActivateApplication on the AUMID (this keeps package
# identity AND lands the flag on the command line, so it propagates to the renderers).

$ErrorActionPreference = 'Stop'
$Aumid = 'Claude_pzs8sxrjxfjjc!Claude'   # confirm via: Get-StartApps | ? Name -eq 'Claude'
$Flag  = '--disable-gpu-compositing'

Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
[ComImport, Guid("2E941141-7F97-4756-BA1D-9DECDE894A3D"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IApplicationActivationManager {
    int ActivateApplication([In] string appUserModelId, [In] string arguments, [In] int options, [Out] out uint processId);
}
[ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]
public class ApplicationActivationManager { }
public static class ClaudeLauncher {
    public static uint Launch(string aumid, string args) {
        var mgr = (IApplicationActivationManager)(new ApplicationActivationManager());
        uint pid; int hr = mgr.ActivateApplication(aumid, args, 0, out pid);
        if (hr != 0) Marshal.ThrowExceptionForHR(hr);
        return pid;
    }
}
'@

# Return the MSIX Claude main process (exclude --type=* renderer/GPU/utility children
# and the CLI's claude.exe; only the UI process remains).
function Get-ClaudeMain {
    Get-CimInstance Win32_Process -Filter "Name='Claude.exe'" -ErrorAction SilentlyContinue |
        Where-Object { $_.CommandLine -like '*WindowsApps*Claude*' -and $_.CommandLine -notlike '*--type=*' }
}

# Poll until the main process is gone (single-instance lock release).
function Wait-ClaudeGone {
    param([int]$TimeoutMs = 6000)
    $sw = [Diagnostics.Stopwatch]::StartNew()
    while ((Get-ClaudeMain) -and $sw.ElapsedMilliseconds -lt $TimeoutMs) {
        Start-Sleep -Milliseconds 200
    }
}

# Already running with the flag -> nothing to do (AUMID activation focuses it).
$alreadyFlagged = Get-ClaudeMain | Where-Object { $_.CommandLine -match [regex]::Escape($Flag) }
if ($alreadyFlagged) { return }

# Up to 3 tries: kill -> wait for lock release -> launch with flag -> verify it landed.
# If a post-update build releases the lock slowly, a fixed wait can redirect the relaunch
# into the dying old instance and drop the flag. Verify + retry guards against that.
for ($try = 1; $try -le 3; $try++) {
    Get-Process -Name claude -ErrorAction SilentlyContinue |
        Where-Object { try { $_.Path -like '*WindowsApps*' } catch { $false } } |
        Stop-Process -Force
    Wait-ClaudeGone

    [void][ClaudeLauncher]::Launch($Aumid, $Flag)

    # Wait for the main process to appear and confirm the flag is on it.
    $sw = [Diagnostics.Stopwatch]::StartNew()
    do {
        Start-Sleep -Milliseconds 300
        $main = Get-ClaudeMain | Select-Object -First 1
    } while (-not $main -and $sw.ElapsedMilliseconds -lt 8000)

    if ($main -and $main.CommandLine -match [regex]::Escape($Flag)) { break }
    # Flag didn't land (race) -> next loop re-kills and relaunches.
}

Verify the flag is active:

Get-CimInstance Win32_Process -Filter "Name='Claude.exe'" | ? CommandLine -match 'disable-gpu-compositing'

(If that prints a line, it worked. If it prints nothing, Claude isn't running with the flag.)

Heads-up: this is still an unofficial, undocumented workaround — a future Claude/Electron update could change the activation behavior and break it.

Rems19 · 3 months ago

I don't know if that option is new (I guess so since @ReconGrunt said on June 5 that it would be a great feature), but I found a way easier and less hacky solution on Reddit, courtesy of user SuperStumps.
Hardware acceleration can be disabled by clicking on the hamburger menu in the top left, going to help > troubleshooting > disable hardware acceleration to toggle it off.
After a restart, the issue completely disappeared.
Source: https://www.reddit.com/r/ClaudeAI/comments/1twxqff/comment/os03ftb/

upstagedrew · 2 months ago

This is a critical flaw that's been going on for two weeks, when is a fix coming? We've lost a solid days of developer time just trying to get this to work with no resolution. All of the mitigation issues listed here disable the use of Claude Code and Cowork or fail to solve the chrome slow down and freeze issues.

I wish I could say iwata-1116's hack works, but it doesn't (I appreciate the effort). This needs a fix Anthropic, now!

github-actions[bot] · 1 month ago

This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.