Moin Martin,
Genau. Und mittlerweile habe ich auch ein paar Code-Snippets gefunden, die sowas ohne C# und ohne .NET hinkriegen wollen. Das käme meiner Philosophie entgegen: Im Idealfall in reinem Standard-C und ausschließlich per Windows-API ohne zusätzliche Frameworks oder Bibliotheken.
soweit ich mich erinnere ist das auch nicht so schwierig:
Screenshot erzeugen
- Jeweils die Rückgabewerte der Funktionen prüfen.
- Device Context des Screens holen
HDC dcScreen = GetDC(nullptr); // Freigabe mit ReleaseDC
- kompatiblen Device Context erzeugen
HDC dcc = CreateCompatibleDC(dcScreen); // Freigabe mit DeleteDC
- Bitmap (
HBITMAP
-Typ) erzeugenHBITMAP bmp = CreateCompatibleBitmap(dcScreen, width, height); // Freigabe mit DeleteObject
- Bitmap in den kompatiblen Device Context selektieren
SelectObject(dcc, bmp);
- „Bit-Level Transfer“ des Bildschirminhalts in die Bitmap
BitBlt(dcc, x0, y0, width, height, dcScreen, wndLeft, wndTop, SRCCOPY);
Bitmap-Daten extrahieren
BITMAPINFO
der Bitmap initialisieren (Achtung: Der Speicher einerBITMAPINFO
musssizeof(BITMAPINFO) + 2 * sizeof(RGBQUAD)
sein).const std::size_t BIS(sizeof(BITMAPINFO) + 2 * sizeof(RGBQUAD)); char infoMem[BIS] = { 0 }; BITMAPINFO *info = reinterpret_cast<BITMAPINFO*>(&infoMem); info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(dcScreen, bmp, 0, 0, NULL, info, DIB_RGB_COLORS);
- Die Bildhöhe in
info
muss für den nächsten Schritt negativ sein:const long height = info->bmiHeader.biHeight; info->bmiHeader.biHeight *= -1;
- Rohe Bitmap-Daten extrahieren
char *data = new char[info->bmiHeader.biSizeImage]; GetDIBits(dcScreen, bmp, 0, height, info, DIB_RGB_COLORS); // sollte einen Wert gleich height zurückgeben
Das müsste grob auch das sein, was du im Internet/der Microsoft-Dokumentation findest.
Viele Grüße
Robert