DirectX - Screenshot von Vollbildanwendung



  • Moin.

    Ich möchte Screenshots von einer beliebigen (Vollbild-)Anwendung erstellen. Das Screenshot erstellen an sich bekomme ich schon hin, nur erhalte ich bei Anwendungen, die im Vollbild laufen, nur weiße Screenshots.

    Mein bisheriger Code:

    Initialisierung von D3D:

    D3DManager::D3DManager(HWND window)
    {
    	pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);
    
    	ZeroMemory(&D3Dpp, sizeof(D3Dpp));
    	D3Dpp.Windowed = true;
    	D3Dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    
    	HRESULT result = pD3D9->CreateDevice(
    		D3DADAPTER_DEFAULT,
    		D3DDEVTYPE_HAL,
    		window,
    		D3DCREATE_MIXED_VERTEXPROCESSING,
    		&D3Dpp,
    		&pD3DDevice);
    }
    

    Screenshot Funktion

    void D3DManager::TakeScreenShot(LPCTSTR pDestFile)
    {
        D3DDISPLAYMODE displayMode;
    	LPDIRECT3DSURFACE9 pd3dsFront = NULL;
    	pD3DDevice->GetDisplayMode(0, &displayMode);
    
    	pD3DDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pd3dsFront, NULL);
    
    	pD3DDevice->GetFrontBufferData(0, pd3dsFront);
    	D3DXSaveSurfaceToFile(pDestFile, D3DXIFF_BMP, pd3dsFront, NULL, NULL);
    
        if(pd3dsFront) pd3dsFront->Release();
    }
    

    Aufruf

    #include "D3DManager.h"
    
    int main()
    {
        D3DManager* d3d = new D3DManager(FindWindow(NULL, "NAME D. ANWENDUNG"));
        d3d->TakeScreenShot("test.bmp");
        delete d3d;   
    }
    

    Meine Fragen:
    Wie finde ich heraus, ob eine Anwendung im Vollbildmodus läuft?
    Wieso sind Screenshots von Vollbildanwendungen nur weiß?



  • Hi ich bin neu hier und habe genau das gleiche Problem.

    Da ich mittlerweile in vielen Foren tätig war weiß ich, das es eher gern gesehen wird, wenn man einen bestehen Thread, der zum Thema passt nimmt, als wenn man immer wieder für jedes bischen nen neuen aufmacht.

    Erst einmal zum Post des Threaderstellers:
    Ich bin kein C++ Profi. Normalerweise Code ich C# oder VB. Aber ich sehe auf jeden Fall, warum dein Code nicht funzt ^^

    Du erstellst ein neues Device, ohne darauf zu zeichnen und speicherst es dann als Screenshot. Dann ist das Bild natürlich Weiß oder Schwarz, da ja noch nichts gezeichnet wurde.

    Man muss sich ans DirectX hooken, um an das aktive Device von DirectX zu kommen. Über das kommt man dann an den Frontbuffer ran, in dem die Informationen zum aktuellen Bildschirminhalt liegen. Und davon kann man nun ein Abbild machen und speichern.

    Nun meine Frage: Wie geht das? Ich kann zwar ein wenig C++. Aber das mit dem hooken und anschließend den Frontbuffer in eine Datei packen bekomme ich nicht hin. kennt da jemand gute quellen, wo man sich einen hook mal ansehen kann, der vielleicht eine ähnliche Aufgabe erfüllt? Oder hat da vielleicht jemand ein Code-Paste oder so?

    Ich danke vorab für die Hilfe


Anmelden zum Antworten