Wer findet den Fehler (Screenshotprogramm)



  • Hallo. Ich habe mir folgenden Code auf einer Seite kopiert. Jedoch beim ausführen erkennt man nur ca. 2/3 des Bildes. Kann mir einer sagen wo der Fehler ist?

    #include <windows.h>
    const char *AppName="Yeah";
    
    void SaveScreen(HWND pScreen, char Path[])
    {
    	int     Width  = GetSystemMetrics(SM_CXSCREEN);
    	int     Height   = GetSystemMetrics(SM_CYSCREEN);
    
        HDC hdcScreen;
        HBITMAP hbmScreen;
    
        //---------------Bitmap Informationen
        BITMAPINFO infobmp;
        infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        infobmp.bmiHeader.biWidth = Width;
        infobmp.bmiHeader.biHeight = Height;
        infobmp.bmiHeader.biPlanes = 1;
        infobmp.bmiHeader.biBitCount = 24;
        infobmp.bmiHeader.biCompression = 0;
        infobmp.bmiHeader.biSizeImage = 0;
        infobmp.bmiHeader.biXPelsPerMeter = 0;
        infobmp.bmiHeader.biYPelsPerMeter = 0;
        infobmp.bmiHeader.biClrUsed = 0;
        infobmp.bmiHeader.biClrImportant = 0;
    
        int* bitmap = new int[Width*Height*3];
    
        BITMAPFILEHEADER bfheader;
    
        bfheader.bfType = 19778;
        bfheader.bfSize = sizeof(BITMAPFILEHEADER) + Width*Height*3 + sizeof(BITMAPINFOHEADER);
        bfheader.bfReserved1 = 0;
        bfheader.bfReserved2 = 0;
        bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        //Bitmap -----------------------      Informationen
    
        hdcScreen = GetWindowDC(pScreen);
        hbmScreen = CreateCompatibleBitmap(hdcScreen,Height, Width);
    
        // temporärer DC
        HDC hdcTemp = CreateCompatibleDC( hdcScreen );
    
        // Bitmap reinselektieren
        HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen );
    
        // Inhalt von Desktop übertragen
        BitBlt( hdcTemp, 0, 0, Height, Width, hdcScreen, 0, 0, SRCCOPY );
    
        int iResult = GetDIBits(hdcTemp,hbmScreen,0,Height,bitmap,&infobmp,DIB_RGB_COLORS);
    
        // aufräumen
        SelectObject( hdcTemp, hbmOld );
        DeleteObject( hbmScreen );
        DeleteDC( hdcTemp );
    
        HANDLE hfile = CreateFile( Path,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
    
        //Datei Schreiben
        DWORD word;
        WriteFile(hfile,&bfheader,14,&word,NULL);
        WriteFile(hfile,&infobmp,40,&word,NULL);
        WriteFile(hfile,bitmap,Width*Height*3,&word,NULL);
    
        ReleaseDC(pScreen,hdcScreen);
        CloseHandle(hfile);
        delete[] bitmap;
    }
    
    int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
    {
    	HWND hWnd = FindWindow(NULL, AppName);
    
        Sleep(2000);
    	char *path="C:\\neu.bmp";
    	Sleep(1000);
    	SaveScreen(hWnd, path);
    
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • OK. Habe den Fehler gefunden aber beim Screenshot ist die Maus nicht drauf kann man das ändern?



  • Dr. Evil schrieb:

    OK. Habe den Fehler gefunden aber beim Screenshot ist die Maus nicht drauf kann man das ändern?

    Wäre auch schön, wenn du uns allen deinen Fehler mitteilst.



  • Hallo,

    Dr. Evil schrieb:

    OK. Habe den Fehler gefunden aber beim Screenshot ist die Maus nicht drauf kann man das ändern?

    z.B. mit GetCursorInfo die Daten zum Maus-Cursor holen, und mit DrawIcon dann selber auf den Screenshot zeichnen.

    MfG,

    Probe-Nutzer


Log in to reply