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!