Screenshot erstellen



  • Hallo Forenmitgleider 🙂
    Ich komme mal gleich zur sache:

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class CStellwerk
    {
    private:
        HWND m_hDesktop;
    public:
    
        void MakeScreenshot(char SavePath[]);
        void SaveScreen(HWND pScreen, char Path[]);
    };
    
    void CStellwerk::MakeScreenshot(char SavePath[])
    {
         m_hDesktop =  GetDesktopWindow();
         if(m_hDesktop == NULL)
         {
             exit(1);
         }
         SaveScreen(m_hDesktop,SavePath);
    }
    
    int main()
    {
        CStellwerk Stellwerk;
        Stellwerk.MakeScreenshot("C:\\screen.bmp");
    
    }
    
    void CStellwerk::SaveScreen(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("c:\\screen.bmp"), // 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;
    }
    

    Ergibt beim C::B folgende Fehler bei mir:

    main.cpp: In member function void CStellwerk::SaveScreen(HWND__*, char*)': main.cpp:81: error:_T' was not declared in this scope
    main.cpp:81: warning: unused variable '_T'
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 1 warnings



  • Nimm statt _T einfach TEXT(), das funktionier häufiger.
    Oder gib am anfang der datei #define _T TEXT an.



  • Also jetzt rastet der Compiler richtig.
    Das doofe bei solchen Fehlern ist, dass ich nichtmal erahnen kann was los ist.

    Linking console executable: bin\Debug\screeny.exe
    obj\Debug\main.o: In function ZN10CStellwerk10SaveScreenEP6HWND(char *)': main.cpp:45: undefined reference toCreateCompatibleDC@4'
    main.cpp:46: undefined reference to CreateCompatibleBitmap@12' main.cpp:47: undefined reference toSelectObject@8'
    main.cpp:49: undefined reference to BitBlt@36' main.cpp:65: undefined reference toGetDIBits@28'
    main.cpp:99: undefined reference to SelectObject@8' main.cpp:100: undefined reference toDeleteDC@4'
    main.cpp:102: undefined reference to `DeleteObject@4'
    collect2: ld returned 1 exit status



  • Bibliothek Gdi32.lib inkludieren !



  • Das wars, danke 🙂


Anmelden zum Antworten