bitmap aus zwischenlage kopieren



  • hi leute
    ich will ein prog schreiben das zu einem bestimmten zeitpunk ein "foto" (snapshot) vom bildschirm macht und in eine datei speichert:

    int main()
    {
    	fstream file("file.bmp", ios::binary | ios::app | ios::out);
    
    	int ok = OpenClipboard(NULL); 
        char * cBuffer = NULL; 
    
    	keybd_event(VK_SNAPSHOT, 0, 0, 0);
    
        if (!ok) return 1; 
    
        HANDLE hClipData = GetClipboardData( CF_BITMAP ); 
        cBuffer = (char*)GlobalLock( hClipData ); 
        GlobalUnlock( hClipData ); 
        CloseClipboard(); 
    
    	file.write(cBuffer, strlen (cBuffer));
    	file.close();
    
    	getchar();
    	return 0;
    }
    

    jetz bekomme ich immer ne tolle fehlermeldung:

    Unbehandelte Ausnahme in snapshot.exe: 0xC0000005: Access Violation.

    ich benutze microsoft visual c++

    vielleicht kann mir einer sagen was ich falsch gemacht habe...

    mfg killakathl



  • Falsch ist schonmal, dass in cBuffer ne Bitmap und kein String ist und daher darf kein strlen() benutzt werden.

    Bei CF_BITMAP kannste dir das GLobalLock() glaube ich sparen.
    Du kriegst direkt nen HBITMAP-Handle, dass man via CopyImage() erstmal kopieren sollte, da das Handle dem Clipboard gehört.
    Anschließend könntest du die Bitmap in einen DC selektieren und mit der Funktion zum Bitmap-Speichern in der WinAPI-FAQ speichern.

    Du kannst das Bild aus der Zwischenablage nicht direkt speichern, da auch bei CF_DIB oder CF_DIBV5 die BITMAPFILEHEADER-Struktur fehlt und du die erzeugte Datei somit mit keiner Anwendung öffnen könntest!



  • ok danke


Anmelden zum Antworten