Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么DWMRegister缩略图会失败?_Windows_Winapi_Dwm - Fatal编程技术网

Windows 为什么DWMRegister缩略图会失败?

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语句失败

我试图捕获子窗口的屏幕,并在Windows7的父表面上渲染它

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。