Robert B.: Windows-Tool gesucht

Beitrag lesen

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

  1. Jeweils die Rückgabewerte der Funktionen prüfen.
  2. Device Context des Screens holen
    HDC dcScreen = GetDC(nullptr);
    // Freigabe mit ReleaseDC
    
  3. kompatiblen Device Context erzeugen
    HDC dcc = CreateCompatibleDC(dcScreen);
    // Freigabe mit DeleteDC
    
  4. Bitmap (HBITMAP-Typ) erzeugen
    HBITMAP bmp = CreateCompatibleBitmap(dcScreen, width, height);
    // Freigabe mit DeleteObject
    
  5. Bitmap in den kompatiblen Device Context selektieren
    SelectObject(dcc, bmp);
    
  6. „Bit-Level Transfer“ des Bildschirminhalts in die Bitmap
    BitBlt(dcc, x0, y0, width, height, dcScreen, wndLeft, wndTop, SRCCOPY);
    

Bitmap-Daten extrahieren

  1. BITMAPINFO der Bitmap initialisieren (Achtung: Der Speicher einer BITMAPINFO muss sizeof(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);
    
  2. Die Bildhöhe in info muss für den nächsten Schritt negativ sein:
    const long height = info->bmiHeader.biHeight;
    info->bmiHeader.biHeight *= -1;
    
  3. 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