Windows: Claude desktop app window intermittently gets stuck as always-on-top (WS_EX_TOPMOST)
Summary
On Windows, the Claude desktop app's main window intermittently gets stuck with the WS_EX_TOPMOST ("always on top") extended window style set. Once this happens, the window stays visually on top of every other application — even after switching focus to another app or clicking another window — until the whole PC is rebooted. Simply restarting the Claude app does not always clear it (a freshly-opened window can already carry the flag).
Environment
- OS: Windows 11 Home, build 10.0.26200
- Claude desktop app: observed on package version
Claude_2.2553.0.0_x64__pzs8sxrjxfjjc(Microsoft Store / MSIX install), and recurred again after a later auto-update - Not caused by a third-party "always on top" utility — confirmed PowerToys and similar tools are not installed/running on the affected machine
What I confirmed (not just a visual impression)
Using the Win32 API directly (GetWindowLong with GWL_EXSTYLE), I verified multiple times, on different days/sessions, that the Claude app's visible top-level window has the WS_EX_TOPMOST (0x8) bit set even when:
- it is not the foreground window (confirmed via
GetForegroundWindow()returning a different app's window while Claude'sEXSTYLEstill shows the topmost bit), and - nothing the user did (that they were aware of) should have requested always-on-top behavior.
Forcing the bit off directly via SetWindowPos(hwnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE) immediately and durably fixes the symptom for that window instance (does not silently get re-asserted by the app afterward), which is strong evidence this is a stuck/leftover window style rather than an intentional, continuously-enforced feature.
This is not a one-off: it has now been observed to recur across multiple separate days on the same machine, sometimes appearing again on a freshly-launched app window (new PID) after the machine was rebooted, so it is not something that only accumulates within one long-running process session.
Possible (unconfirmed) trigger
One occurrence's timing lined up closely with a Claude app auto-update (Windows Event Log showed the app's MSIX package/service being reinstalled a few minutes before the symptom was next observed). I can't confirm this is the actual trigger — it may be coincidental — but it's the only correlation I've been able to find so far, since the bug does not seem to depend on any specific in-app action the user remembers taking.
Impact
The window aggressively covers other applications regardless of focus, which is disruptive when working with multiple windows/monitors. The only reliable fix a non-technical user has today is a full PC reboot.
Workaround used to confirm/mitigate
As a stopgap on the affected machine, a small script polls for the Claude window(s) and clears WS_EX_TOPMOST via SetWindowPos whenever it's set. This reliably resolves the symptom within a few seconds each time it recurs, which further supports that the underlying issue is the app (or Electron) leaving this window style set rather than continuously re-applying it.
Happy to provide more diagnostic detail (window handles, exact timestamps, event log excerpts) if useful.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
I am experiencing the same issue on 2.2553.1.
My workaround is to use PowerToys' AlwaysOnTop which provides a Win-Ctrl-T shortcut to clear the flag.
Same bug here, and I think I've found the trigger — it lines up with the Cowork / VM service idle cycle, not auto-update.
Environment (matches this issue):
What I captured. A watcher polls
WS_EX_TOPMOSTon the Claude main window every second and logs each transition plus the foreground process at that instant. It caught the pin at18:23:25local, with the foreground window being Idle (PID 0) — nobody was interacting with the machine (it had just auto-locked).The correlation.
C:\ProgramData\Claude\Logs\cowork-service.logshows the VM service cycling at that exact second:The window flips topmost at the same second
claude.exereconnects to the freshly restarted VM service. The service log itself has no window/topmost lines (window management is app/renderer side), but the timing is exact.So it's not auto-update (at least here) — it's the app re-asserting topmost on its own main window when it re-attaches to the VM/cowork service after that service cycles on idle.
Repro: leave the machine idle long enough to auto-lock, so the VM service hits its idle timeout and restarts. On reconnect, the main window is pinned. Manual lock/unlock does not reproduce it (no service cycle).
Not persisted / not a 3rd-party tool: the flag is set at runtime (not in
window-state.json/config.json), it's only ever the Claude main window, and PowerToys / other pinning tools were confirmed off.Workaround (same as others here):
SetWindowPos(hwnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE).Posted by Claude on behalf of Dan.
Additional data point: this has now recurred a second time, and both times it correlates exactly with a Claude desktop app auto-update.
2.2553.0.0). My monitoring script's last successful check was at 04:11:50; it (and the underlying symptom) was next observed broken/stuck shortly after.2.2553.0.0to2.2553.1.0. My monitoring script's last successful check was at 21:21:40 — i.e. the update landed almost immediately after, and the always-on-top symptom was present again the next time I checked (2026-09-19 morning).Both times, the Windows Event Log shows the same signature at the moment things broke: a
Service Control Managerevent 7045 reinstalling theClaudeuser-mode service (cowork-svc.exe), bracketed by two 7040 events toggling theIsolationSessionservice start type (demand → auto → demand), i.e. this is the app's own auto-update/relaunch sequence, not something external.Given two-for-two, I'm now fairly confident the auto-update (or the relaunch it performs afterward) is what leaves the new window with
WS_EX_TOPMOSTset — possibly the updater/relaunch path creates or shows the main window without going through whatever code path normally clears/never-sets that style, or a "keep on top while restoring session" step doesn't get undone.