我找到了这个: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/