| Previous | Next |
| DWMERR_CATASTROPHIC_FAILURE | DCOMPOSITION_ERROR_SURFACE_BEING_RENDERED |
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED
What Windows rejected: window already composed
The useful interpretation of DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED (0x88980800) starts at the dcomp boundary: the application attempted to create a second composition target for a window already associated with one. In practical terms, inspect DirectComposition target ownership for an HWND before changing application-wide graphics settings.
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED: DirectComposition batches changes until Commit, while surface drawing has its own BeginDraw/EndDraw lifetime. For DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, Treat those two transactions separately in traces and cleanup. For DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, the built-in one-line message identifies the immediate result; diagnosis also needs the producing API, object ownership and the display generation current at the time.
Build a useful diagnostic record
| Capture item | Why it matters for DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED |
|---|---|
| Decisive capture | HWND, process and thread IDs, existing IDCompositionTarget lifetime, topmost flag and target creation stack |
| Current graph state | DirectComposition device, target, visual tree and surface update transaction |
| Supporting trace | BeginDraw/EndDraw or target-creation sequence, Commit result, HWND ownership and CheckDeviceState output |
| Object identity | DirectComposition target ownership for an HWND |
| Rejected boundary | the application attempted to create a second composition target for a window already associated with one |
For DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, preserve the unsigned HRESULT, symbolic name, first failing API and timestamp in one record. If cleanup later fails too, keep that secondary result separately from DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED.
Separate state from capability
- Freeze the
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDgeneration. Record HWND, process and thread IDs, existing IDCompositionTarget lifetime, topmost flag and target creation stack. Before diagnosingDCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, do not resize, hot-plug, recreate or release the object under examination. - Run the narrow
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDcomparison. create one target successfully and issue a second CreateTargetForHwnd for the same window. During theDCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDcomparison, keep every driver, monitor, resource format and unrelated policy unchanged. - Observe the layer after
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED. ForDCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, if the exact check passes, record the next HRESULT or visible outcome. A different downstream result shows that theDCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDboundary was crossed. - Repeat
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDthrough a lifecycle transition. ForDCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, exercise one relevant resize, mode switch, device recreation, hot-plug or session change and confirm that this result does not reuse stale handles.
The comparison with DCOMPOSITION_ERROR_ACCESS_DENIED is especially useful: DCOMPOSITION_ERROR_ACCESS_DENIED is returned when the window belongs to another process. For DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, recording both names prevents a broad “graphics error” label from merging distinct ownership, capability and lifetime problems.
Verify the repaired path
Keep one target owner per window and release or reuse it during visual-tree replacement. Repair of DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED is complete only when the original call succeeds or returns its documented nonfatal status and the same lifetime test remains correct after a second display transition.
- The
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDtrace identifies one producing API and one current graphics object, rather than only the final UI symptom. - The passing run changes exactly the condition described for
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED; unrelated adapter, monitor and application state remains unchanged. - For
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, debug-layer, ETW or driver diagnostics no longer report the rejected DirectComposition target ownership for an HWND contract during the same scenario. - The application handles recurrence of
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSEDwithout an unbounded retry loop, leaked resource, duplicate composition target or stale topology handle.
Implementation notes for DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED
For DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED, log BeginDraw/EndDraw or target-creation sequence, Commit result, HWND ownership and CheckDeviceState output. When the DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED path returns a count, size, status flag or replacement object, retain it even on a nonfatal result because it can direct the next call.
A production fallback for DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED should be explicit: pause rendering, re-enumerate, rebuild one cache entry, recreate a device, or decline a protected path only when this layer calls for that action. Reinstalling every display component, deleting all caches or forcing a resolution change is not an evidence-based fix for DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED.
Technical references
- Microsoft: DirectComposition error codes — background for the DirectComposition target ownership for an HWND boundary involved in
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED. - Microsoft: DirectComposition reference — background for the DirectComposition target ownership for an HWND boundary involved in
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED. - Microsoft: IDCompositionDevice::Commit — background for the DirectComposition target ownership for an HWND boundary involved in
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED. - Microsoft: IDCompositionDevice::CheckDeviceState — background for the DirectComposition target ownership for an HWND boundary involved in
DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED.
Looking for a different code? Search another status or error code.