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

标签 windows winapi dwm

我找到了这个:https://github.com/steeve/dwmaxx2

它应该是这样工作的:https://www.youtube.com/watch?v=Fpvh16VjrRE

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

有什么方法可以访问窗口纹理,并能够将其映射到某些 3d 对象(如立方体)?

最佳答案

DWM 使用未记录的私有(private) DXGI COM 接口(interface)。当您想要访问 windows 纹理时,可以 Hook 私有(private) 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;
}

关于windows - 如何在 Windows 8 中扭曲/操纵 dwm 实时缩略图,或以任何其他方式访问窗口纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739142/

相关文章:

c# - 如何将数据集添加到报表中 C#

windows - vim 设置标签为绝对路径

python - Windows 上的 Docker-Cloud CLI 错误

c++ - 如何使用特定于应用程序的 key 加密目录?

c++ - 单独调用两个 CreateProcess() 可以共享相同的启动和进程信息吗?

windows - 如何强制 Windows 清除所有磁盘读取缓存数据?

c++ - 如何记住监控应用程序所在的位置?

pyqt - Qt : Erase background (Windows Aero Glass)

c# - 没有 Aero Glass 的 DwmExtendFrameIntoClientArea

dll - WinXP下如何修复DWMAPI.DLL延迟加载依赖?