capture écran DirectX + switch desktop
Bonjour,
J'utilise le code suivant pour faire une copie d'écran devant contenir les rendus 3d/accélérés :
Code:
1 2 3 4 5 6
|
...
g_pDirect3D_Device->CreateOffscreenPlainSurface(nX2, nY2, D3DFMT_A8R8G8B8 /*D3DFMT_A8B8G8R8*/, D3DPOOL_SCRATCH, &frontbuf, NULL);
g_pDirect3D_Device->GetFrontBufferData(NULL, frontbuf);
D3DXSaveSurfaceToFileInMemory(&out, D3DXIFF_BMP, frontbuf, NULL, NULL );
... |
En utilisation normale, pas de soucis.
Je dois afficher le résultat après transformations à l'écran. Ce processus boucle à l'infini, donc pour éviter un effet type Larsen, je switche de desktop comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
void goNextDesktop()
{
/*Backup du desktop d'origine */
hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
/* Ouverture des E/S du desktop courant */
hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);
hOriginalDesktopWindow = GetDesktopWindow();
hOriginalDC = GetDC(hOriginalDesktopWindow);
SetProcessWindowStation(CreateWindowStation("W2W station", CWF_CREATE_ONLY, DELETE|READ_CONTROL|WRITE_DAC|WRITE_OWNER|GENERIC_ALL, NULL));
/* Hop, un desktop tout propre tout neuf encore sous le plastique */
hNewDesktop = CreateDesktop("W2W Desktop", NULL,NULL,0,DELETE|READ_CONTROL|WRITE_DAC|WRITE_OWNER|GENERIC_ALL,NULL);
/* les deux vont de paire */
/* Assignation du processus au desktop indiqué */
SetThreadDesktop(hNewDesktop);
/* Et go sur ledesktop */
SwitchDesktop(hNewDesktop);
} |
Et la se passe un truc étrange : Le rendu accéléré me donne uniquement sa première image mais tout le reste autour fonctionne bien, bouge etc ...
Autre chose étrange : avec le switch de desktop, dwm.exe voit son utilisation RAM osciller entre 350Mo et 2Go (graphe mémoire en dents de scie)
Quelqu'un a t il une idée ?
Merci.