2010-01-27 3 views
1

Je suis en train de capturer l'écran d'une fenêtre de l'enfant et le rendre sur la surface de parent dans Windows 7.Pourquoi DwmRegisterThumbnail peut-il échouer?

HTHUMBNAIL thumbnail = NULL; 
HRESULT hr = S_OK; 
hr = DwmRegisterThumbnail(hWnd, visualHwnd, &thumbnail); 

if(SUCCEEDED(hr)) 
{ 
    ... 
} 

Cela échoue tout le temps. visualHwnd est la fenêtre enfant et hWnd est le parent. Je l'ai aussi essayé sans la relation parent-enfant et ça ne dessine rien, bien attendu car si la déclaration échoue.

Quelle pourrait être la raison?

Voici comment je crée le parent:

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

Et l'enfant:

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); 
+0

Quel est le code d'erreur? – Michael

Répondre

2

De MSDN:

  • hwndDestination

    La poignée de la fenêtre qui utilisera la vignette DWM. Définir les poignées de la fenêtre de destination sur autre chose qu'un type de fenêtre de niveau supérieur entraînera un E_INVALIDARG.

  • HwndSource

    la poignée pour la fenêtre comme étant la source de la vignette. Le fait de définir les poignées de la fenêtre source sur autre chose qu'un type de fenêtre de niveau supérieur entraînera un E_INVALIDARG.

Cela devrait échouer si vous transmettez une fenêtre enfant.

+0

Man cette API Win ne cesse de devenir plus gênant. Connaissez-vous un moyen de capturer une partie de la fenêtre enfant qui exécute OpenGL - avec l'OpenGL? (Il sort vide normalement) J'ai également posé la question ici: http://stackoverflow.com/questions/2143854/getting-screenshot-of-a-child-window-running-opengl-in-it-windows –

+0

Non, je ne le fais pas. OpenGL fenêtré ne désactive-t-il pas le DWM de toute façon (retour au thème Windows Basic)? Dans ce cas, DwmRegisterThumbnail échouera quand même. Si OpenGL désactive DWM, cela implique qu'il contourne la pile GDI traditionnelle et le rend directement à l'écran, ce qui signifie que Wndows n'est pas conscient du contenu de la fenêtre et ne peut donc pas le capturer. – Michael

+0

Cette fenêtre dessine opengl seulement sur une partie de sa fenêtre, un peu comme un logiciel de modélisation 3D, avec l'interface graphique. Donc non, ça ne désactive pas DWM. –

Questions connexes