_ScreenCapture_Capture() bei mehreren Bildschirmen

  • Hallo,

    ich möchte gern mehrere Screenshots machen, habe allerdings drei Bildschirme angeschlossen und fürchte, dass die ScreenShot-Funktion bei negativen Koordinatenangaben durcheinander kommt...


    AUSFÜHRUNGSUMGEBUNG

    - Windows v10 (aber gleicher Effekt bei Windows v7...)

    - Autoit v3.3.15

    - drei Bildschirme am Rechner angeschlossen:

    Die Ecke links/oben des "screen 01" hat die Koordinate (0,0). Die Koordinatenangaben entsprechen den Ausgaben des Programms "Autoit Window Info". Es ergeben sich negative x-Koordinaten für die Bildschirme 2 und 3


    TEST-PROGRAMMCODE


    PROGRAMMABLAUF

    Nach dem Start des Skripts passiert folgendes:

    (1) die Präsentation wird geöffnet und im Präsentationsmodus auf "screen 03" (mittlerer Bildschirm angezeigt.

    (2) die Fenster-Koordinaten werden detektiert. Diese entsprechen den Angaben in "Autoit Window Info" (x=-1920, y=0, width=1920, height=1080)

    (3) es wird auf eine "leere" Präsentation geprüft (dies ist hier aber nicht relevant und funktioniert auch)

    (4) der Bildschirmausschnitt wird aufgezeichnet (capture)

    -> erwartet hätte ich, dass lediglich der mittlere Bildschirm "screen 02" aufgezeichnet wird

    -> allerdings werden Bildschirme "screen 02 " und "screen 01" als großes Gesamtbild aufgezeichnet


    Wenn ich das Testscript mit einem Rechner ausführe, an dem nur EIN Bildschirm angeschlossen ist, so erfolgt das aufzeichnen wie erwartet. Daher würde ich vermuten, dass _ScreenCapture_Capture() möglicherweise mit negativen Angaben nicht gut klarkommt.


    Kennt das jemand? Kann mir jemand helfen?

    Danke erstmal.

    • Offizieller Beitrag

    Warum umständlich die Koordinaten auslesen?

    Benutze einfach "_ScreenCapture_CaptureWnd":

    AutoIt
    #include <ScreenCapture.au3>
    
    $hGUI = WinWaitActive("[CLASS:screenClass]", "", 20)
    
    _ScreenCapture_CaptureWnd(@MyDocumentsDir & "\GDIPlus_Image.jpg", $hGUI)
    
    ShellExecute(@MyDocumentsDir & "\GDIPlus_Image.jpg")
  • Danke, Oscar , für die schnelle Rückmeldung :) .

    Du fragtest nach der Notwendigkeit für das Koordinaten-Auslesen. Ja, ich möchte eigentlich beim Screenshot den linken (und rechten) Rand der jeweiligen Darstellung wegschneiden und benötige daher eine Möglichkeit, die spezifischen Koordinaten für den ScreenShot anzugeben. Allerdings scheint es bei _ScreenCapture_CaptureWnd() so zu sein, dass obwohl man ja einen Window-Handle angibt, die Angabe von einschränkenden Koordinaten ABSOLUT interpretiert werden. Bei Angabe einer X-Position wird also nicht die Position RELATIV zum Rand des gewünschten Fensters $hGUI verwendet, sondern der ScreenShot startet im linken Bildschirm. Nicht im gewünschten Fenster.

    Weiterhin ist es so, dass ich (trotz Angabe von $hGUI und ohne weitere Koordinaten) immer auch den rechten Bildschirm im ScreenShot erhalte. So, als würde die Funktion nicht rechtzeitig "halt" machen.

    Habe es also weiterhin leider noch nicht lösen können.

    Gibt es weitere Möglichkeiten, die ich probieren könnte, um einen ScreenShot eines klar definierten Bereichs innerhalb eines Fensters zu erhalten, wenn ich mehrere Bildschirme angeschlossen habe?

  • Hier vorab mal ein Funktion mit der du Windows speichern kannst... gleich kommt noch eine Funktion, mit der du es analog zu dieser mit Screens machen kannst... da holst du dann nicht die Koordinaten des Windows, sondern des Screens... ansonsten bleibt fast alles gleich.

    CaptureWnd.au3

    Einmal editiert, zuletzt von Bitnugger (22. November 2017 um 14:34)

  • Schau mal ob du damit was anfangen kannst...

    ScreenCapture.au3
  • ScreenShot eines klar definierten Bereichs

    Ich kann nicht wirklich nachvollziehen, was du damit meinst.

    Edit: Aaaah, ich denke du willst das hier...

    CaptureWnd mit/ohne Titelleiste und Rahmen oder nur ohne Rahmen rechts/links

    Einmal editiert, zuletzt von Bitnugger (22. November 2017 um 15:40)

  • Sauber, Bitnugger, vielen Dank.

    Der Fehler lag in meiner eigenen Berechnung. Ich hatte die Fensterbreite falsch ermittelt und das hat das Chaos verursacht. Konnte dies allerdings erst finden, als ich mir über ein geeignetes Debugging (per AutoitStudio und DBUG) gedanken gemacht hatte, bei dem man ALLE Variablen auf einmal checken konnte. _ScreenCapture_CaptureWnd() funktioniert also auch mit negativen Werten zuverlässig.