Screenshot und Upload Funktion



  • Hallo,

    ich verwende den folgenden Code um einen Screenshot zu erstellen. Dieser wird in der Variable hBitmap abgelegt. Nun möchte ich das Bild ins Internet hochladen ohne dies vorher auf der Festplatte zu speichern. Dabei habe ich an einen Image-Hoster wie beispielsweise http://Imageshack.us gedacht. Leider kriege ich nicht den Upload hin, da ich keine externen DLL's verwenden darf.

    /* <Include> */
    #include <windows.h>
    /* </Include> */
    
    /* <Const> */
    const char *AppName="Yeah";
    /* </Const> */
    
    /* <Function> */
    void SaveScreen(HWND pScreen, char Path[])
    {
    	int     Width  = /*GetSystemMetrics(SM_CXSCREEN)*/1280;
    	int     Height = /*GetSystemMetrics(SM_CYSCREEN)*/1024;
    
        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, Width, Height);
    
        // tempor?rer DC
        HDC hdcTemp = CreateCompatibleDC(hdcScreen);
    
        // Bitmap reinselektieren
        HBITMAP hbmOld = (HBITMAP)SelectObject(hdcTemp, hbmScreen);
    
        // Inhalt von Desktop ?bertragen
        BitBlt(hdcTemp, 0, 0, Width, Height, 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;
    }
    /* </Function> */
    
    int WINAPI WinMain(      
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
    {	
    	HWND hWnd = FindWindow(NULL, AppName);
    
    	char *path="C:/neu.bmp";
    	Sleep(1000);
    	SaveScreen(hWnd, path);
    
    	return 0;
    }
    

    Ich weiß, dass ich irgendwie mit Streams arbeiten muss, hab aber keinen Plan wie ich das tun soll. Kann mir irgendeiner von euch klugen Köpfen helfen den Kram in einen Stream zu kriegen? Ich verzweifel daran 😞



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) 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.



  • da du ja eine kommunikation mit dem http server des dienstes aufbauen musst, kannst du ganz einfach sockets verwenden. musst mal gucken, wie der dateiaustausch durch das http protokoll spezifiziert ist.



  • wenn du daten durch sockets sendest, dann brauchst du diese natürlich nicht erst auf einer festplatte zu speichern, da sie sende/empfangs funktionen zeiger auf speicherbereiche im arbeitsspeicher erwarten.

    ps:

    ich verwende den folgenden Code um einen Screenshot zu erstellen. Dieser wird in der Variable hBitmap abgelegt.

    der ganze screenshot wird sicherlich nicht in einem datenobjekt vom typ HBITMAP (ist ein handle, also ein doppelwort) gespeichert. (sehe auch gar keinen bezeichner "hBitmap", welcher auf HBITMAP schließen würde) 🤡



  • pps: bitte nicht negativ auffassen mein beitrag^^ der name "ralf_roflt_herum" ist mir einfach spontan eingefallen und hat mit dem thread nichts zu tun!


Anmelden zum Antworten