#pragma once #include "FrameSourceBase.h" // 使用 Desktop Duplication API 捕获窗口 // 在单独的线程中接收屏幕帧以避免丢帧 class DesktopDuplicationFrameSource : public FrameSourceBase { public: DesktopDuplicationFrameSource() {}; virtual ~DesktopDuplicationFrameSource(); bool Initialize() override; UpdateState Update() override; bool IsScreenCapture() override { return true; } protected: bool _HasRoundCornerInWin11() override { return true; } private: bool _InitializeDdpD3D(HANDLE hSharedTex); static DWORD WINAPI _DDPThreadProc(LPVOID lpThreadParameter); winrt::com_ptr _outputDup; std::vector _dupMetaData; HANDLE _hDDPThread = NULL; std::atomic _exiting = false; // 0: 等待新帧 // 1: 新帧到达 // 2: 等待第一帧 std::atomic _newFrameState = 2; // DDP 线程使用的 D3D 设备 winrt::com_ptr _ddpD3dDevice; winrt::com_ptr _ddpD3dDC; // 这些均指向同一个纹理 // 用于在 D3D Device 间同步对该纹理的访问 winrt::com_ptr _sharedTex; winrt::com_ptr _sharedTexMutex; winrt::com_ptr _ddpSharedTex; winrt::com_ptr _ddpSharedTexMutex; RECT _srcClientInMonitor{}; D3D11_BOX _frameInMonitor{}; };