Nehmen screenshot des desktops aller sichtbaren Anwendungen und Formulare
Arbeite ich mit einem system, das verfügt über 4 Ausgänge (Monitore) mit z.B. 1280x1024 Pixel für jeden Ausgang. Ich brauche einen screenshot des gesamten desktop und alle geöffneten Anwendungen.
Versuchte ich GetDesktopWindow()
(MSDN) aber es funktioniert nicht richtig. Einige Formulare nicht angezeigt, auf das aufgenommene Bild.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich nicht.
Den
GetDesktopWindow
- Funktion gibt eine Griff, um das desktop-Fenster. Es hat nichts zu tun mit dem aufnehmen eines Bilds des Fensters.Neben das desktop-Fenster ist nicht das gleiche wie "den ganzen Bildschirm". Es bezieht sich speziell auf das desktop-Fenster. Sehen dieser Artikel für mehr Informationen und was kann schief gehen, wenn Sie den Missbrauch der Griff von dieser Funktion zurückgegeben wird.
Dies ist relativ einfach zu tun .NET-Framework mit
Grafik.CopyFromScreen
Methode. Sie nicht sogar brauchen, zu tun, alle P/Invoke!Der einzige trick in diesem Fall ist sicherzustellen, dass Sie übergeben Sie die entsprechende Abmessungen. Da hast du 4 Monitore, vorbei nur die Maße von dem primären Bildschirm funktioniert nicht. Sie müssen übergeben Sie die Abmessungen der gesamten virtuellen Bildschirm, die enthält alle Ihre Monitore. Abrufen dieser durch Abfragen der
SystemInformation.VirtualScreen
- Eigenschaft gibt die Grenzen des virtuellen Bildschirms. Wie die Dokumentation zeigt, ist dies der Grenzen der gesamte desktop auf eine mehrfach-monitor-system.Beispielcode:
Edit:
Hmm, ich wollte nicht sehen, eine WPF-tag auf die Frage, oder irgendwo erwähnt in den Körper.
Egal, obwohl. Der code, den ich gepostet funktioniert gut in einer WPF-Anwendung, solange Sie fügen Sie die entsprechenden Verweise und using-Deklarationen. Sie müssen
System.Windows.Forms
undSystem.Drawing
. Es könnte ein WPF-esque Art und Weise, dies zu tun, ist es nicht erforderlich eine Abhängigkeit auf diese WinForms-Baugruppen, aber ich würde nicht wissen, was es ist.Es funktioniert sogar auf einem anderen thread. Es gibt hier nichts, der erforderlich wäre, den UI-thread.
Ja, ich habe es getestet. Hier ist meine komplette test-code: