From 2ca5c46b472b9ec86b2ed47c17fa590dc4775fb8 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sat, 5 Sep 2026 12:10:43 +1000 Subject: [PATCH] fix(windows): mask resized window captures --- electron/ipc/recording/windows.test.ts | 5 +++++ .../bin/win32-x64/helpers-manifest.json | 6 +++--- electron/native/bin/win32-x64/wgc-capture.exe | Bin 121856 -> 121856 bytes .../native/wgc-capture/src/wgc_session.cpp | 20 +++++++++++++----- electron/native/wgc-capture/src/wgc_session.h | 1 + 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/electron/ipc/recording/windows.test.ts b/electron/ipc/recording/windows.test.ts index 5881eecc..0d561339 100644 --- a/electron/ipc/recording/windows.test.ts +++ b/electron/ipc/recording/windows.test.ts @@ -122,4 +122,9 @@ describe("native Windows window capture", () => { ); expect(windowsCaptureSource).not.toContain("nextWidth != captureWidth_"); }); + + it("does not expose desktop pixels when the selected window shrinks", () => { + expect(windowsCaptureSource).toContain("(std::min)(mappedWidth"); + expect(windowsCaptureSource).toContain("ClearRenderTargetView"); + }); }); diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index 5fe298ae..0172a0c3 100644 --- a/electron/native/bin/win32-x64/helpers-manifest.json +++ b/electron/native/bin/win32-x64/helpers-manifest.json @@ -5,10 +5,10 @@ "helpers": { "wgc-capture": { "binaryName": "wgc-capture.exe", - "binarySha256": "c0dca95216a46474f1c71e2274228cbc78dd09c49e1539333a76183b115b1c5a", + "binarySha256": "a5a9c0c417144a834af3206b60bae32d0c21d55deb8a3f5446831621cfdfa7b3", "sourceDir": "electron/native/wgc-capture", - "sourceFingerprint": "9d8ba313407468ddff200317b210e74953e683c9ccd2e27104dd9e94b8efa7cb", - "updatedAt": "2026-09-04T21:09:08.014Z" + "sourceFingerprint": "c65b6eb2230be7db9b49aac48eba52a9eac469028ebb242e10c16c51c86b3220", + "updatedAt": "2026-09-05T02:09:18.163Z" }, "cursor-monitor": { "binaryName": "cursor-monitor.exe", diff --git a/electron/native/bin/win32-x64/wgc-capture.exe b/electron/native/bin/win32-x64/wgc-capture.exe index 5ea3098e9f8140306b567bf796f92363e7c0c0c5..efa45c37dcfc551a2c4f1878e35f8433d01e6bec 100644 GIT binary patch delta 24712 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 delta 24521 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 NnE|DZF7dk!{tuc`yhi{4 diff --git a/electron/native/wgc-capture/src/wgc_session.cpp b/electron/native/wgc-capture/src/wgc_session.cpp index 95dd17da..1dde8081 100644 --- a/electron/native/wgc-capture/src/wgc_session.cpp +++ b/electron/native/wgc-capture/src/wgc_session.cpp @@ -256,20 +256,27 @@ bool WgcSession::updateWindowCropRect(bool initializeSize) { desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; desc.SampleDesc.Count = 1; desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_RENDER_TARGET; ComPtr resizedTexture; if (FAILED(d3dDevice_->CreateTexture2D(&desc, nullptr, &resizedTexture))) return false; + ComPtr renderTargetView; + if (FAILED(d3dDevice_->CreateRenderTargetView(resizedTexture.Get(), nullptr, &renderTargetView))) return false; cropTexture_ = resizedTexture; + cropRenderTargetView_ = renderTargetView; } - if (!cropTexture_) return false; + if (!cropTexture_ || !cropRenderTargetView_) return false; // The encoder's dimensions are fixed for the lifetime of the MP4. Keep the // crop texture fixed too: reallocating it after a resize made the encoder - // pad the changed frame with black bars. - left = std::clamp(left, 0L, static_cast(framePoolWidth_ - captureWidth_)); - top = std::clamp(top, 0L, static_cast(framePoolHeight_ - captureHeight_)); - cropRect_ = {left, top, left + captureWidth_, top + captureHeight_}; + // pad the changed frame with black bars. If the selected window shrinks, + // copy only its current area so the crop never exposes nearby desktop pixels. + const LONG copyWidth = (std::min)(mappedWidth, static_cast(captureWidth_)); + const LONG copyHeight = (std::min)(mappedHeight, static_cast(captureHeight_)); + left = std::clamp(left, 0L, static_cast(framePoolWidth_) - copyWidth); + top = std::clamp(top, 0L, static_cast(framePoolHeight_) - copyHeight); + cropRect_ = {left, top, left + copyWidth, top + copyHeight}; return true; } @@ -308,6 +315,7 @@ void WgcSession::stopCapture() { framePool_ = nullptr; } cropTexture_.Reset(); + cropRenderTargetView_.Reset(); } void WgcSession::onFrameArrived( @@ -349,6 +357,8 @@ void WgcSession::onFrameArrived( if (SUCCEEDED(hr) && texture && frameCallback_) { if (windowHandle_ && cropTexture_ && updateWindowCropRect()) { + constexpr float clearColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + d3dContext_->ClearRenderTargetView(cropRenderTargetView_.Get(), clearColor); D3D11_BOX sourceBox{ static_cast(cropRect_.left), static_cast(cropRect_.top), 0, static_cast(cropRect_.right), static_cast(cropRect_.bottom), 1, diff --git a/electron/native/wgc-capture/src/wgc_session.h b/electron/native/wgc-capture/src/wgc_session.h index 3bc0968e..a2a15466 100644 --- a/electron/native/wgc-capture/src/wgc_session.h +++ b/electron/native/wgc-capture/src/wgc_session.h @@ -39,6 +39,7 @@ private: ComPtr d3dDevice_; ComPtr d3dContext_; ComPtr cropTexture_; + ComPtr cropRenderTargetView_; winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice winrtDevice_{nullptr}; winrt::Windows::Graphics::Capture::GraphicsCaptureItem captureItem_{nullptr}; winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool framePool_{nullptr};