Ich versuche Screenshots mit der BitBlt-Funktion zu erstellen. Aber jedes Mal, wenn ich einen Screenshot mache, ändert sich der Nicht-Client-Bereich NIE, egal was ich mache. Es ist, als würde es eine Kopie davon erhalten. Der Clientbereich wird korrekt erfasst.
Wenn ich das Fenster schließe und dann wieder öffne und einen Screenshot mache, wird der Nicht-Client-Bereich so wie er ist erfasst. Nachfolgende Captures nach dem Verschieben / Ändern der Größe des Fensters haben keine Auswirkungen auf den Screenshot. Auch hier wird der Client-Bereich korrekt sein.
Außerdem scheint die CAPTUREBLT-Flagge überhaupt nichts zu tun. Ich bemerke keine Veränderung mit oder ohne es. Hier ist mein Capture-Code:
%Vor%Der meiste Code stammt aus der QWidget :: grabWindow-Funktion von Qt, da ich einige Änderungen vornehmen wollte, um flexibler zu sein. Qt's Dokumentation besagt, dass:
Die Funktion "grabWindow ()" packt Pixel vom Bildschirm, nicht vom Fenster, wenn es ein anderes Fenster gibt ganz oder teilweise über den einen greifen Sie, Sie erhalten Pixel von der darüber liegendes Fenster.
Allerdings erlebe ich das genaue Gegenteil ... unabhängig von der CAPTUREBLT-Flagge. Ich habe alles versucht, was mir einfällt ... nichts funktioniert. Irgendwelche Ideen?
Ihre Verwirrung über BitBlt mit dem CAPTUREBLT Verhalten rührt daher, dass die offizielle BitBlt Dokumentation unklar und irreführend ist.
Gibt an, dass
"CAPTUREBLT - Enthält alle Fenster, die im resultierenden Bild über dem Fenster liegen. Standardmäßig enthält das Bild nur Ihr Fenster."
Was eigentlich bedeutet (zumindest für jedes Windows-Betriebssystem ohne Aero aktiviert) "CAPTUREBLT - Schließt alle überlagerten (!) Fenster ein (siehe WS_EX_LAYERED-Fenster mit erweitertem Fenster), die Ihr Fenster überlappen. Nicht überlagerte Fenster, die Ihr Fenster überlappen, sind niemals enthalten."
Windows ohne WS_EX_LAYERED erweiterten Fenster-Stil, der Ihr Fenster überlappt, ist nicht enthalten mit oder ohne CAPTUREBLT -Flag (zumindest für jedes Windows-Betriebssystem ohne Aero aktiviert).
QT-Entwickler haben auch die BitBlt / CAPTUREBLT-Dokumentation falsch verstanden, so dass die QT-Dokumentation tatsächlich falsch über das QPixmap :: grabWindow-Verhalten auf der WIN32-Plattform ist, ohne Aero aktiviert zu haben.
HINZUFÜGEN:
Wenn Sie Ihr Fenster auf dem Bildschirm erfassen möchten, müssen Sie den gesamten Desktop mit dem Flag CAPTUREBLT erfassen und dann das Rechteck mit Ihrem Fenster extrahieren. (QT-Entwickler sollten das Gleiche tun). Es wird in beiden Fällen korrekt funktionieren: mit und ohne Aero aktiviert / verfügbar.
Ich nehme den gesamten Bildschirm auf und erhalte die gleichen Ergebnisse ...: (
%Vor%Tags und Links c++ qt windows screen-capture