Windows 为什么DWMRegister缩略图会失败?
我试图捕获子窗口的屏幕,并在Windows7的父表面上渲染它Windows 为什么DWMRegister缩略图会失败?,windows,winapi,dwm,Windows,Winapi,Dwm,我试图捕获子窗口的屏幕,并在Windows7的父表面上渲染它 HTHUMBNAIL thumbnail = NULL; HRESULT hr = S_OK; hr = DwmRegisterThumbnail( hWnd, visualHwnd, &thumbnail ); if( SUCCEEDED( hr ) ) { ... } 这总是失败的。visualHwnd是子窗口,hWnd是父窗口。我也尝试了它,但没有父子关系,它什么也画不出来,这是意料之中的事,因为if语句失败
HTHUMBNAIL thumbnail = NULL;
HRESULT hr = S_OK;
hr = DwmRegisterThumbnail( hWnd, visualHwnd, &thumbnail );
if( SUCCEEDED( hr ) )
{
...
}
这总是失败的。visualHwnd是子窗口,hWnd是父窗口。我也尝试了它,但没有父子关系,它什么也画不出来,这是意料之中的事,因为if语句失败了
原因可能是什么
下面是我如何创建父对象的:
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
和孩子:
CreateProcessA( NULL, "PVFOX.exe \"view3.pv\" ", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &piVisual);
WaitForInputIdle( piVisual.hProcess, INFINITE );
Sleep( 3000 );
EnumWindows(EnumWindowsProc, 0);
SetParent(visualHwnd, hWnd);
从MSDN:
- hwndDestination 将使用DWM缩略图的窗口的句柄。将目标窗口句柄设置为顶级窗口类型以外的任何类型都将导致E_INVALIDARG
- hwndSource 窗口的句柄将用作缩略图源。将源窗口句柄设置为顶级窗口类型以外的任何类型将导致E_INVALIDARG
如果您通过一个子窗口,则此操作可能会失败。Man此Win API越来越不方便。您知道一种方法来捕获在其中运行OpenGL的子窗口的一部分吗?使用OpenGL?(通常是空白)我在这里也问了一个问题:不,我没有。窗口化的OpenGL是否会禁用DWM(返回到Windows基本主题)?在这种情况下,DwmRegisterThumbnail仍将失败。如果OpenGL确实禁用了DWM,这意味着它绕过了传统的GDI堆栈并直接渲染到屏幕,这意味着Wndows不知道窗口的内容,因此无法捕获它。此窗口仅在其窗口的一部分上绘制OpenGL,有点像3D建模软件,带有GUI。因此,它不会禁用DWM。