Repository navigation
record: native WGC capture fails on Windows 10 22H2 — CreateForMonitor returns E_ACCESSDENIED (0x80070005) #1247
Description
Native Windows capture fails on Windows 10 22H2: CreateForMonitor returns E_ACCESSDENIED (0x80070005)
Copy the whole of this file into the GitHub issue body. Attach
wgc-capture-error-dialog.png (in this folder) as the screenshot.
Summary
On a stock Windows 10 Pro 22H2 (build 19045.6466) machine, recording never starts: the native capture helper reports it cannot create a WGC capture item for the selected monitor. Every attempt to record ends with the dialog in the attached screenshot.
Error: WARNING: Could not opt out of power throttling (error 87)
{"event":"ready","schemaVersion":2} ERROR: CreateForMonitor failed (hr=0x80070005)
ERROR: Failed to initialize WGC display sessionThe machine is well above the documented minimum requirements, and other Chromium-based software on it captures the screen without any problem, so I do not think this is a hardware or OS-capability limitation. I could not find any policy, privacy setting, remote session or display driver on this machine that would explain the refusal — details of what I ruled out are below, in case it saves you time.
Environment
| OpenScreen | 2.0.0 (Windows x64; native binaries are byte-identical to the official installer — see note at the end) |
| Electron | 41.2.1 (bundled) |
| OS | Windows 10 Pro 22H2, build 19045.6466 |
| CPU | 12th Gen Intel Core i7-12700K (SSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F all present) |
| GPU | NVIDIA GeForce RTX 3060, driver 32.0.16.1656 (2026-08-20) |
| Displays | 2 × AOC2402, extended desktop; the failing source is the secondary display at physical origin x=2560 (2560×1440 @ 125%) |
| Session | SESSIONNAME=Console, local interactive; not RDP; OpenInputDesktop succeeds |
| Chrome / Edge | 155.0.8059.41 / 155.0.4283.45 — both run and capture normally on this machine |
| Virtual display drivers | none (single NVIDIA adapter) |
| Virtualisation | none (ASUS/AMI BIOS, physical machine) |
| Third-party AV/security | none installed; Microsoft Defender running with default settings |
So Chromium's sandbox appears unable to initialise for the Electron main process on
this machine, while Chromium 155 in Chrome/Edge is unaffected. I am reporting it
because it may be the same underlying condition, and because the silent
exit 0 with no diagnostic output made the original problem very hard to see. Happy
to run whatever collection steps you want (Procmon, WER dumps, sandbox logs) if it
helps.
Workaround I tried
is-native-windows-capture-available returns missing-helper when the helper file is
absent (electron/ipc/handlers.ts:2457-2466), and the renderer then falls through to
Chromium's own getDisplayMedia pipeline
(src/hooks/useScreenRecorder.ts:1227-1230, then :1849-1861). Renaming
resources/electron/native/bin/win32-x64/wgc-capture.exe therefore switches the app
onto the browser pipeline by design. On this machine that still did not produce a
usable recording, so I am not offering it as a fix — only as evidence that the app's
own fallback routing behaves as documented.
Ask
- Is there any additional diagnostic the helper could print at the point
CreateForMonitorfails (theHMONITORvalue, the monitor rect, the process token/integrity,GraphicsCaptureSession::IsSupported())? Right nowE_ACCESSDENIEDis the only signal, and nothing in the app logs distinguishes "monitor rejected" from "capture refused for this process". - Would you consider reporting
CreateForMonitorfailure asmissing-helper-style unavailable (falling through to browser capture with a warning) rather than throwing and blocking the recording entirely? On a machine like this one the browser pipeline is the only path that could still work. - If it is useful, I can collect full WER dumps or a Procmon trace around the
CreateForMonitorcall.
Note on the build used for these logs: it is OpenScreen 2.0.0 built from the
v2.0.0 tag, with one upstream post-2.0.0 Windows fix ported in
(the CONTENT_PROTECTION_BREAKS_CLICK_THROUGH gate from
electron/windows.ts, needed because 2.0.0's click-through HUD is unusable on
Windows 10). wgc-capture.exe, compositor_view.node and every other native binary
are taken unmodified from the official Openscreen.Setup.2.0.0.exe payload — so the
capture failure above is produced by your shipped helper, not by anything I changed.
The screenshot and the two logs in this report were produced by that build running on
the machine described.
Activity
airobotnews commentedon Oct 15, 2026
In order to solve the problem where WGC cannot record videos,Add a DXGI Desktop Duplication fallback for Windows screen capture.。
dxgi-desktop-duplication-fallback.md
dxgi-capture-fallback-main.patch
Summary
On some Windows 10 machines
IGraphicsCaptureItemInterop::CreateForMonitorisrefused with
E_ACCESSDENIED(0x80070005) even thoughGraphicsCaptureSession::IsSupported()returns1and every other capture route onthe same machine works. When that happens the Windows helper cannot start a capture
session at all, so the app cannot record.
This change adds DXGI Desktop Duplication as a second frame source behind the
existing
WgcSessioninterface. WGC is still tried first and remains the default;the fallback runs only when
initialize()fails. Nothing downstream changes — theencoder, the MP4 muxer, audio, webcam, the cursor sampler, the JSON event protocol
and the renderer are untouched.
Diff: 5 files, +604 / −6.
main.cppis +11 / −6.The attachment contains the modification report and the patch.
This is the branch:airobotnews/openscreen:fix/dxgi-capture-fallback