如何在Windows 8中扭曲/操纵dwm live缩略图,或以任何其他方式访问窗口纹理?

如何在Windows 8中扭曲/操纵dwm live缩略图,或以任何其他方式访问窗口纹理?,windows,winapi,dwm,Windows,Winapi,Dwm,我发现: 这就是它的工作原理: 但这在Windows 8/8.1中似乎不起作用,或者我做错了什么。它已加载,获得了要渲染的窗口的有效HWND句柄,但无法获取窗口纹理 是否有任何方法可以访问窗口纹理,并能够将其映射到某些3d对象,如立方体?DWM使用未记录的私有DXGI COM接口。当您想要访问windows纹理时,可以钩住私有DXGI COM 对于Win7: /* interface IDXGIFactoryDWM */ static const GUID IID_IDXGIFactoryDWM

我发现:

这就是它的工作原理:

但这在Windows 8/8.1中似乎不起作用,或者我做错了什么。它已加载,获得了要渲染的窗口的有效HWND句柄,但无法获取窗口纹理


是否有任何方法可以访问窗口纹理,并能够将其映射到某些3d对象,如立方体?

DWM使用未记录的私有DXGI COM接口。当您想要访问windows纹理时,可以钩住私有DXGI COM

对于Win7:

/* interface IDXGIFactoryDWM */
static const GUID IID_IDXGIFactoryDWM = {0x713F394E,0x92CA,0x47E7
                            ,{0xAB,0x81,0x11,0x59,0xC2,0x79,0x1E,0x54}};
struct IDXGIFactoryDWM: public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateSwapChain(IUnknown *pDevice,
                      DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, 
                      IDXGISwapChainDWM **ppSwapChain) = 0;
};

/* interface IDXGISwapChainDWM */
static const GUID IID_IDXGISwapChainDWM = {0xF69F223B,0x45D3,0x4AA0,
                                {0x98,0xC8,0xC4,0x0C,0x2B,0x23,0x10,0x29}};

struct IDXGISwapChainDWM: public IDXGIDeviceSubObject
{
    virtual HRESULT STDMETHODCALLTYPE Present(UINT SyncInterval, UINT Flags) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetBuffer(UINT Buffer, REFIID riid, void **ppSurface) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc) = 0;
    virtual HRESULT STDMETHODCALLTYPE ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) = 0;
    virtual HRESULT STDMETHODCALLTYPE ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetContainingOutput(IDXGIOutput **ppOutput) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetLastPresentCount(UINT *pLastPresentCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget) = 0;
};
对于Win8:

struct __declspec(uuid("{1ddd77aa-9a4a-4cc8-9e55-98c196bafc8f}"))
IDXGIFactoryDWM8 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainDWM(
    /* [annotation][in] */ 
    _In_ IUnknown *pDevice, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_DESC1 *pSwapChainDesc1, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pSwapChainFullScreenDesc1, 
    /* [annotation][in] */ 
    _In_ IDXGIOutput * pOutput, 
    /* [annotation][out] */ 
    _Out_ IDXGISwapChainDWM8 ** ppSwapChainDWM1
    ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainDDA(
    /* [annotation][in] */ 
    _In_ IUnknown *pDevice, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_DESC1 *pSwapChainDesc1, 
    /* [annotation][in] */ 
    _In_ IDXGIOutput * pOutput, 
    /* [annotation][out] */ 
    _Out_ IDXGISwapChainDWM8 ** ppSwapChainDWM8
    ) = 0;
}

DWM使用未记录的专用DXGI COM接口。当您想要访问windows纹理时,可以钩住私有DXGI COM

对于Win7:

/* interface IDXGIFactoryDWM */
static const GUID IID_IDXGIFactoryDWM = {0x713F394E,0x92CA,0x47E7
                            ,{0xAB,0x81,0x11,0x59,0xC2,0x79,0x1E,0x54}};
struct IDXGIFactoryDWM: public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateSwapChain(IUnknown *pDevice,
                      DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, 
                      IDXGISwapChainDWM **ppSwapChain) = 0;
};

/* interface IDXGISwapChainDWM */
static const GUID IID_IDXGISwapChainDWM = {0xF69F223B,0x45D3,0x4AA0,
                                {0x98,0xC8,0xC4,0x0C,0x2B,0x23,0x10,0x29}};

struct IDXGISwapChainDWM: public IDXGIDeviceSubObject
{
    virtual HRESULT STDMETHODCALLTYPE Present(UINT SyncInterval, UINT Flags) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetBuffer(UINT Buffer, REFIID riid, void **ppSurface) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc) = 0;
    virtual HRESULT STDMETHODCALLTYPE ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) = 0;
    virtual HRESULT STDMETHODCALLTYPE ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetContainingOutput(IDXGIOutput **ppOutput) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetLastPresentCount(UINT *pLastPresentCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget) = 0;
};
对于Win8:

struct __declspec(uuid("{1ddd77aa-9a4a-4cc8-9e55-98c196bafc8f}"))
IDXGIFactoryDWM8 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainDWM(
    /* [annotation][in] */ 
    _In_ IUnknown *pDevice, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_DESC1 *pSwapChainDesc1, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pSwapChainFullScreenDesc1, 
    /* [annotation][in] */ 
    _In_ IDXGIOutput * pOutput, 
    /* [annotation][out] */ 
    _Out_ IDXGISwapChainDWM8 ** ppSwapChainDWM1
    ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainDDA(
    /* [annotation][in] */ 
    _In_ IUnknown *pDevice, 
    /* [annotation][in] */ 
    _In_ DXGI_SWAP_CHAIN_DESC1 *pSwapChainDesc1, 
    /* [annotation][in] */ 
    _In_ IDXGIOutput * pOutput, 
    /* [annotation][out] */ 
    _Out_ IDXGISwapChainDWM8 ** ppSwapChainDWM8
    ) = 0;
}