Screenshots in Spielen machen



  • Hallo, wie kann man Screenshots in Spielen wie z.b. in Starcraft 2 machen.
    Wenn ich z.b. die Druck Taste auf meiner Tastatur drücke dann geht es ja nicht.
    Mit Fraps kann ich aber Screenshots machen.

    Welche Schnittstelle müsste ich benutzen um selber ein Programm zu schreiben welches Screenshots in allen Spielen machen kann ?

    OpenGL oder DirectX ?



  • Bassmaster schrieb:

    Welche Schnittstelle müsste ich benutzen um selber ein Programm zu schreiben welches Screenshots in allen Spielen machen kann ?

    OpenGL oder DirectX ?

    Beides, und es reicht nicht einfach die zu nutzen sondern du wirst dich in die jeweilige vom Spiel verwendete API einklinken müssen (Dll Injection/Hook) um an den Backbuffer zu gelangen...


  • Mod

    eigentlich bietet jedes spiel screenshot funktionen, manchmal ist das F12 oder F10, einfach googlen oder im handbuch nachsehen, sparst dir viel arbeit 😉



  • vllt hilft dir auch das weiter:
    http://www.chip.de/downloads/Game-Cam_29003842.html

    wenn du eine ganz bestimmte Funktion brauchst (die existierende Screenshot-Tools nicht bieten), solltest du vllt etwas näher erklären was du vor hast



  • #include <windows.h> 
    #include <string> 
    #include <iostream> 
    
    #define _T TEXT 
    
    using namespace std; 
    
    class CScreenshot 
    { 
    private: 
        HWND m_hDesktop; 
        void SpeicherBildschirm(HWND pScreen, char Path[]); 
    
    public: 
    
        bool ScreenFull(char SavePath[]); 
        bool ScreenFenster(char SavePath1[]); 
    
    }; 
    
    bool CScreenshot::ScreenFull(char SavePath[]) 
    { 
         m_hDesktop =  GetDesktopWindow(); 
         if(m_hDesktop == NULL) 
         { 
             return FALSE ; 
             exit(1); 
         } 
         SpeicherBildschirm(m_hDesktop,SavePath); 
         return TRUE; 
    } 
    bool CScreenshot::ScreenFenster(char SavePath[]) 
    { 
         //Ab da weiß ich nicht weiter 
         return TRUE;     
    } 
    
    int main() 
    { 
        CScreenshot Screenshot; 
        Screenshot.ScreenFull("C:\\screen100.bmp"); 
    } 
    
    void CScreenshot::SpeicherBildschirm(HWND pScreen, char Path[]) 
    { 
    int     nWidth  = GetSystemMetrics(SM_CXSCREEN); 
    int     nHeight = GetSystemMetrics(SM_CYSCREEN); 
    
    HWND    hWnd    = ::GetDesktopWindow(); 
    HDC     hdc     = ::GetDC(hWnd); 
    HDC     memDC   = ::CreateCompatibleDC(hdc); 
    HBITMAP hbm     = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); 
    HBITMAP hbmOld  = (HBITMAP)::SelectObject(memDC, hbm); 
    
    ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); 
    
    BITMAPINFO bmi; 
    
    ZeroMemory(&bmi, sizeof(bmi)); 
    
    bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth        = nWidth; 
    bmi.bmiHeader.biHeight       = nHeight; 
    bmi.bmiHeader.biBitCount     = 24; 
    bmi.bmiHeader.biPlanes       = 1; 
    bmi.bmiHeader.biCompression  = BI_RGB; 
    bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * nWidth * nHeight / 8; 
    
    BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; 
    
    ::GetDIBits( memDC, 
                 hbm, 
                 0, 
                 bmi.bmiHeader.biHeight, 
                 pbBits, 
                 &bmi, 
                 DIB_RGB_COLORS ); 
    
    BITMAPFILEHEADER bfh; 
    
    bfh.bfType      = ('M' << 8) + 'B'; 
    bfh.bfSize      = sizeof(BITMAPFILEHEADER)  + 
                      bmi.bmiHeader.biSizeImage + 
                      sizeof(BITMAPINFOHEADER); 
    bfh.bfReserved1 = 0; 
    bfh.bfReserved2 = 0; 
    bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
    // 
    //  Hier: 
    // 
    HANDLE hfile = CreateFile( _T(Path), // UM DIESE ZEILE GEHT ES! 
                               GENERIC_WRITE, 
                               0, 
                               0, 
                               OPEN_ALWAYS, 
                               0, 
                               0 ); 
    
    DWORD dwWritten; 
    
    WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL); 
    WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL); 
    WriteFile(hfile,pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL); 
    
    CloseHandle(hfile); 
    
    ::SelectObject(memDC, hbmOld); 
    ::DeleteDC(memDC); 
    ::ReleaseDC(hWnd,hdc); 
    ::DeleteObject(hbm); 
    
    delete[] pbBits; 
    }
    

    Warum OGL, DX oder Hooks? o0



  • Kóyaánasqatsi schrieb:

    Warum OGL, DX oder Hooks? o0

    Schonmal ausprobiert was für Bilder das von einer D3D oder OGL Anwendung liefert? Wie schauts mit Fullscreen-Anwendungen aus?



  • Warum OGL, DX oder Hooks? o0

    Weil dein Code nicht funktioniert?



  • Ja ich weiss das es in den Spielen Screenshot funktionen gibt. ^^
    Aber ich möchte gerne selbst ein Programm schreiben was sowas kann.

    Und mit Fraps kann man ja auch Screenshots in allen Spielen machen und das wird wohl keine DLL Injections benutzen ...

    Nur wie macht Fraps das ganze ?



  • Bassmaster schrieb:

    Nur wie macht Fraps das ganze ?

    Indem es sich über Dll Injection/Hooks zwischen die jeweilige Grafik-API (D3D oder OpenGL) und die Anwendung schaltet...



  • o_O Okay ...

    Scheint ja wohl doch eine größere Aktion zu sein. ^^

    Dafür hab ich leider im moment keine Zeit mich damit genauer zu befassen. 😞

    Naja irgendwann hab ich auch mal wieder mehr Zeit. (=


Anmelden zum Antworten