1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. nnako

Beiträge von nnako

  • _ScreenCapture_Capture() bei mehreren Bildschirmen

    • nnako
    • 29. November 2017 um 10:13

    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.

  • _ScreenCapture_Capture() bei mehreren Bildschirmen

    • nnako
    • 22. November 2017 um 08:53

    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?

  • _ScreenCapture_Capture() bei mehreren Bildschirmen

    • nnako
    • 20. November 2017 um 12:30

    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:

    Code
                                     X-COORD
                             negative <- -> positive
                                        |
     ----------------  ---------------- + ---------
    |                ||                ||          |
    |                ||                ||          |
    |                ||                ||   main   |
    |     screen     ||     screen     ||  screen  |
    |       02       ||       03       ||    01    |
    |                ||                ||          |
    |                ||                ||          |
    |                ||                | ----------
    |                ||                |
     ----------------  ----------------
    Alles anzeigen

    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

    AutoIt
    #include <GuiConstantsEx.au3>
    #include <ScreenCapture.au3>
    #include <File.au3>
    #include <Array.au3>
    
    ; some settings
    $strPathToExe = "c:\Program Files (x86)\Microsoft Office\Office16\powerpnt.exe"
    $strDirToPpt = "."
    $strFileName = "test.ppt"
    ;$strFileName = "test__empty.ppt"
    $colorForScreenEmptyCheck = 0xFFFFFF
    
    ;
    ; open powerpoint application
    ;
    
    Run( $strPathToExe & " /s " & $strDirToPpt & "\" & $strFileName ) ;\
    
    ; wait for powerpoint to become active
    $hdl = WinWaitActive( "[CLASS:screenClass]", "", 5 )
    if $hdl = 0 then
        MsgBox(0, "ERROR", "Powerpoint could not be opened.")
        Exit
    endif
    
    ;
    ; get position of relevant window
    ;
    
    $aPos   = WinGetPos($hdl)
    $xPos   = $aPos[0]
    $yPos   = $aPos[1]
    $width  = $aPos[2]
    $height = $aPos[3]
    
    _ArrayDisplay($aPos)
    
    ;
    ; check for empty slide on screen
    ;
    
    ; check a box within the screen for a color
    ; which normally exists in standard presentations
    
    $ret = PixelSearch( _
        $xPos+400, _
        $yPos+400, _
        $xPos+$width-400, _
        $yPos+$height-400, _
        $colorForScreenEmptyCheck _
        )
    
    ; if the color was found
    If @error <> 1 Then
    
        ;
        ; get screen contents
        ;
    
        _ScreenCapture_Capture( _
            $strDirToPpt & "\test.png" _
            , $xPos _
            , $yPos _
            , $xPos + $width -1 _
            , $yPos + $height -1 _
            , False _
            )
    EndIf
    
    ;
    ; leave current presentation
    ;
    
    ; activate presentation window (just in case)
    WinActivate( $hdl )
    
    ; wait for powerpoint to become active
    $hdl = WinWaitActive( "[CLASS:screenClass]", "", 5 )
    if $hdl = 0 then
        MsgBox(0, "WARNING", "Powerpoint could not be closed.")
        Exit
    endif
    
    ; send ESCAPE character
    Send( "{ESC}" )
    Alles anzeigen


    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.

  • Tutorial: Wie man Script-Fehler erfolgreich sucht/findet bzw. richtig debuggt

    • nnako
    • 19. August 2015 um 07:09

    Hallo,

    vielen Dank erstmal für die Antworten.

    Zitat von Andy


    Was erwartest du? ...
    Debuggen/Fehler suchen läuft darauf hinaus den Fehler zu analysieren, ...
    Dazu muss man sich intensiv mit dem Code auseinandersetzen...


    Was "debuggen" heißt, wissen wir wahrscheinlich beide ;) . Es ging mir nur um die Verfügbarkeit und Verwendbarkeit eines passenden Werkzeugs, das einem die Arbeit erleichtern könnte. Händisch zusätzlichen Code zur Ausgabe von Statuswerten oder Zwischenergebnissen in den zu debuggenden Code einzufügen, halte ich einfach für aufwändiger als das Arbeiten mit einem ECHTEN Werkzeug, wie es der "Autoit Debugger" versucht zu sein. Vorteile wären (Du fragtest, was ich erwarte):

    - keine Notwendigkeit zur Eingabe von zusätzlichem Code um das Debugging durchzuführen
    - dynamische Unterbrechbarkeit des Programmdurchlaufs an beliebiger Stelle
    - Einzelschritt-Modus der Programmabarbeitung sowie Breakpoints und Trigger
    - dynamische Konfigurierbarkeit der Ausgabe beliebiger Variablen und Speicherauszüge
    - ...

    Einfach so, wie es das für andere Programmiersprachen i.d.R. auch gibt (egal, ob kommandozeilenbasiert wie z.B. PDB für Python oder grafisch wie per Eclipse). Die Verwendung eines solchen Debuggers bewahrt mich davor, mein AutoIt-Skript immer und immer wieder von vorn ablaufen lassen zu müssen, mich dann durchzuklicken, bis ich an die fragliche Stelle komme,... dann zu merken, dass ich die Ursache für das merkwürdige Programmverhalten dort nicht in der erwarteten Weise (mit den codierten Print-Ausgaben) finden kann,... dann das ganze nochmal von vorn...

    Ich nehme also mit, dass es für AutoIt kein nutzbares, echtes Debugging-Werkzeug der in diesem Beitrag beschriebenen Art gibt.


    Zitat von Andy

    Da kann ich in AutoIt auch DebugMsgboxen oder Consolenausgaben per Tastaturshortcut in den Code eingeben, den Fehler finden und per Shortcut alle wieder loswerden!

    Gibt es zur Einrichtung solcher Tasten-Shortcuts und der entsprechenden Code-Teile bereits nutzbare Anleitungen hier im Forum?

    Danke.
    nnako

  • Tutorial: Wie man Script-Fehler erfolgreich sucht/findet bzw. richtig debuggt

    • nnako
    • 17. August 2015 um 16:09

    Hallo,

    ich bin nach wie vor auf der Suche nach einer Möglichkeit, meinen (teilweise länglichen) AutoIt-Code schmerzfrei zu debuggen. Weiter oben in diesem Thread wurde (vor einigen Jahren) eine händische Methode beschrieben, die auf jeden Fall für das Debugging kleiner und kleinster Programme geeignet ist, und die sicher heute noch Gültigkeit haben wird. Aber wie sieht es mit dem Debugging von großen Projekten aus? Ich lese ab und zu mal was von einem "AutoIt Debugger", der seit vielen Monaten in der Version 0.47.0 z.B. über heise.de erhältlich ist, dessen Homepage aber nicht besonders lebendig aussieht.

    - Hat damit schon jemand Erfahrungen gesammelt?
    - lohnt sich eine (zunächst aufwändig wirkende) Installation?
    - ist dieses Tool brauchbar? Mit welchen Einschränkungen?

    Danke.
    nnako

  • wie kann man ein GIF incl. Transparenz speichern (z.B. _ScreenCapture_Capture)

    • nnako
    • 5. Dezember 2014 um 21:18
    Zitat von UEZ

    Die weiße Fläche sollte komplett Transparent sein.

    Sehr schön. Vielen Dank. Genau das brauchte ich!!! :)

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 27. November 2014 um 20:26

    Sorry, nochmal.

    > Wenn Du den Inhalt der Zwischenablage nicht "killen" willst, dann sichere ihn vor _Excel_RangeCopyPaste und stelle ihn dann wieder her.

    Gibt es für das Sichern und Wiederherstellen des Clipboards geeignete Funktionen?

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 27. November 2014 um 20:17

    Super. Nun funktioniert's. Danke.

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 27. November 2014 um 19:28

    Sorry. Hast recht. Ich meinte $oWorksheet . Der Effekt ist aber der gleiche, wenn man zwei Range-Objekte verwendet und kein Clipboard.

    Man kann dann also das Kopieren nicht weiter spezifizieren?

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 27. November 2014 um 19:16

    Nun muss ich aber doch nochmal bzgl. _EXCEL_RangeCopyPaste() nachfragen. Und zwar versuche ich beim Kopieren OHNE das Clipboard auszukommen. Also direkt die SourceRange (als Objekt) in die TargetRange (als Objekt) eines anderen Workbooks einzufügen. Mir scheint es so, als würde es folgendermaßen aussehen:

    -> es ist für die Operation irrelevant, ob der Parameter $oWorkbook das Source- oder das Target-Workbook ist
    -> die beiden Parameter $iPaste und $iOperation sind irrelevant für den direkten Kopiervorgang
    -> es wird immer ALLES (incl. Formeln, bedinten Formatierungen,...) von Source nach Target kopiert

    Ist das wirklich so? Soll das so? Oder habe ich einen Fehler gemacht?

    Eigentlich möchte ich nur die "Values" der Zellen direkt übertragen, nicht die anderen Eigenschaften.

  • XML oder XML-ähnliche Struktur auslesen

    • nnako
    • 26. November 2014 um 14:28

    Hallo,

    habe mir beide Vorschläge angeschaut und dann festgestellt, dass es am einfachsten wäre, ich täte Folgendes:

    - Einlesen der gesamten strukturierten Textdatei in eine Stringvariable
    - Durchsuchen des Strings nach interessierendem "Knoten" per StringInStr()
    - Sprung an den Beginn des Knotens und sukzessives Auslesen der weiteren Komponenten

    Eigentlich brauche ich ja gar nicht die komplette Struktur des Dokuments, sondern immer nur Einzelinformationen. Und da ist dann das direkte Suchen doch angebracht.

    Vielen Dank erstmal für die Rückmeldungen und Ideen.

  • wie kann man ein GIF incl. Transparenz speichern (z.B. _ScreenCapture_Capture)

    • nnako
    • 25. November 2014 um 11:24

    Hallo UEZ,

    danke für die schnelle Antwort.

    Es muss nicht unbedingt GIF sein. Verwende GIF aber gern, da es bei filigranen Darstellungen "besser" aussieht als JPG und dabei noch sehr klein bleibt. Ist die Vorgabe von Transparenz denn bei PNG einfacher möglich?

    EDIT:
    @ Techmix: doch, GIF unterstützt Transparenz. Kann man z.B. per IrfanView einstellen.

    Gruß.

  • wie kann man ein GIF incl. Transparenz speichern (z.B. _ScreenCapture_Capture)

    • nnako
    • 25. November 2014 um 11:00

    Hallo,

    ich möchte gern einen Screenshot machen und diesen dann als GIF abspeichern. Das geht eigentlich wunderbar mit _ScreenCapture_Capture() . Allerdings kann ich hier nicht weiter spezifizieren, welchen Farbwert ich gern als "transparent" definieren möchte.

    Weiß jemand, wie ich sowas in Kombination mit Screenshots und GIFs erreichen könnte?

    Danke.

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 16. November 2014 um 18:02

    Great!

    _Excel_RangeCopyPaste() seems to work just fine.

    Is there a way to include these hints about the special behaviour of _Excel_RangeWrite() and _Excel_RangeRead() somewhere in a documentation?

    Thanks.

  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 15. November 2014 um 21:57

    er ist leider bereits sehr lang... daher hier gekürzt und hoffentlich lauffähig...

    EDIT, 16.11.2014: CODE auf wesentliche Inhalte gekürzt

    Code
    ...
    ; set length of column from NUMBER column (example value)
    $numOfRows = 10
    
    
    ; run through all column names present in the TEMPLATE
    $numOfNames = Ubound( $A_STR__CELL_NAMES_OPL )
    for $i = 0 to $numOfNames -1
    
    
        ; find coordinates of first cell below header cell of specific column in ORIGINAL FILE
        $iSourceCol = $oOldWorkbook.ActiveSheet.Range( $A_STR__CELL_NAMES_OPL[$i] ).Column
        $iSourceRow = $oOldWorkbook.ActiveSheet.Range( $A_STR__CELL_NAMES_OPL[$i] ).Row +1
    
    
        ; convert range to TEXT
    ;    $oRange = $oOldWorkbook.ActiveSheet.Range( $A_STR__CELL_NAMES_OPL[$i] )
    ;    $oRange.NumberFormat = "@"
    
    
        ; get array from ORIGINAL FILE
        $aContentsOfRow = _Excel_RangeRead( _
            $oOldWorkbook, _
            Default, _
            _Excel_ColumnToLetter( $iSourceCol ) & String( $iSourceRow ) & ":" & _
                _Excel_ColumnToLetter( $iSourceCol ) & String( $iSourceRow + $numOfRows ), _
            1 _
            )
    
    
        ; find coordinates of target column in TEMPLATE FILE
        $iTargetCol = $oNewWorkbook.ActiveSheet.Range( $A_STR__CELL_NAMES_OPL[$i] ).Column
        $iTargetRow = $oNewWorkbook.ActiveSheet.Range( $A_STR__CELL_NAMES_OPL[$i] ).Row +1
    
    
        ; write array to TARGET FILE
        _Excel_RangeWrite( _
            $oNewWorkbook, _
            $A_STR__SHEETS_TEMPLATE[$IDX_SHEET_OPL], _
            $aContentsOfRow, _
            _Excel_ColumnToLetter( $iTargetCol ) & String( $iTargetRow ), _
            True, _
            True _
            )
    
    
    next
    ...
    Alles anzeigen
  • EXCEL: Kopieren von Spalten unterschiedlichen Typs

    • nnako
    • 15. November 2014 um 20:33

    Hallo,

    seit vielen Stunden versuche ich die Excel UDF der Autoit v3.3.12.0 produktiv zu verwenden. Folgende Aufgabe:

    - es sollen eine Reihe von Spalten mit jeweils fester Länge
    - von einem Workbook in ein anderes kopiert werden
    - dabei können die Inhalte der Spalten jeweils Werte, Text, Datumsangaben oder Mischungen derselben enthalten

    Die Grundstruktur des Code ist hier dargestellt:

    - in einer FOR-Schleife werden ca. 10 vordefinierten Zellnamen durchgegangen
    - zunächst werden die Koordinaten der entsprechenden Zellbereiche ermittelt
    - und die Zellen per _Excel_RangeRead() in einer Arrayvariable zwischengespeichert
    - dann erfolgt das Aufspüren der jeweiligen Zielzellen im anderen Workbook
    - und das Hineinschreiben der zwischengespeicherten Arrayvariable per _Excel_RangeWrite()

    Es ergibt sich folgendes Problem: Die Zellen in meinem Quell-Workbook enthalten nicht nur Zahlen ("Values"), sondern auch manchmal mehrzeiligen Text oder Datums-Werte. Wenn ich also bei _Excel_RangeRead() den Parameter "iReturn" mit [1=values] wähle, läuft die Kopiererei so lange durch, bis beim Lesen per _Excel_RangeRead() eben dieser mehrzeilige Zelleninhalt erkannt wird und folgende Fehlermeldung erscheint:

    "Error: The requested action with this object has failed"
    Der Fehler bezieht sich dabei auf Zeile 732 in der "Excel.au3" der oben erwähnten Version. Dort scheint ein Transpose nicht zu funktionieren.

    In einem weiteren Schritt versuchte ich, die reinen Textkomponenten der Zellen auszulesen. In der Hoffnung, dass die Werte auf diese Weise als Text mit berücksichtigt werden. Wenn ich aber _Excel_RangeRead() mit dem Parameter "iReturn" = [3=the displayed text] aufrufe, bleiben ALLE Zellen nach dem Kopieren in das andere Workbook LEER.

    Weiter versuchte ich, zunächst per <range>.NumberFormat = "@" eine Umwandlung der Values (und Texte) in Texte zu bewirken und dann mit "iReturn" = [3] zu kopieren, aber auch dann bleiben die Zielzellen komplett leer.

    Hat jemand eine Idee, wo möglicherweise mein Denkfehler liegt?

    Danke.

  • Verzeichnis per Dialog erzeugen und auswählen

    • nnako
    • 27. Oktober 2014 um 17:47

    oh... ich seh schon...

    den dritten Parameter gibt es in der Funktion gar nicht ;)

    Danke.
    nnako

  • Verzeichnis per Dialog erzeugen und auswählen

    • nnako
    • 27. Oktober 2014 um 17:38

    Hallo chip,

    hier das, was ich sehe.

    Code
    [Blockierte Grafik: http://www11.pic-upload.de/27.10.14/zstx6o57u8q.gif]

    Dialog-Box
    [Blockierte Grafik: http://www11.pic-upload.de/27.10.14/le1xydr67ulk.gif]

    Weiß auch nicht, was hier falsch läuft.

    Gruß
    nnako

  • Verzeichnis per Dialog erzeugen und auswählen

    • nnako
    • 27. Oktober 2014 um 16:53

    Hallo chip,

    das scheint (laut der Funktionsreferenz) nur bei XP zu funktionieren. Habe Win7 und die "1" als Konfiguration ausprobiert. Leider erscheint nur die Auswahl. Keine Möglichkeit zum Anlegen von Verzeichnissen.

    Andere Ideen?

    Danke.
    nnako

  • Verzeichnis per Dialog erzeugen und auswählen

    • nnako
    • 27. Oktober 2014 um 13:47

    Hallo,

    ich möchte auf komfortable Weise das Erzeugen und Auswählen eines Verzeichnisses ermöglichen. Der Dialog, der bei FileOpenDialog() geöffnet wird, ist prinzipiell genial. Auch die Auswahlmöglichkeiten beim Dialog des FileSelectFolder() scheint brauchbar. Eine reine Erzeugungsfunktion wäre DirCreate(). Allerdings gibt es jeweils ein Problem:

    - bei FileOpenDialog() kann man zwar Verzeichnisse erzeugen, den Dialog aber nicht ohne Dateiauswahl erfolgreich beenden
    - bei FileSelectFolder() kann man keine Verzeichnisse anlegen, sondern nur bestehende Verzeichnisse auswählen
    - bei DirCreate() hat man keinen Dialog, sondern muss das Verzeichnis bei Funktionsausführung schon kennen

    Gibt es eine Funktion, die mir per Dialog das ERZEUGEN eines Verzeichnisses und das AUSWÄHLEN des Verzeichnisses mit anschließender Verzeichnisnamen-Rückgabe ermöglicht?

    Danke und Gruß
    nnako

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™