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
BITMAPINFOder Bitmap initialisieren (Achtung: Der Speicher einerBITMAPINFOmusssizeof(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
infomuss 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