Screenshot erstellen

  • Moin,
    tut mir fast schon leid euch wieder belästigen zu müssen, aber ich habe erneut ein "kleines" Problem.
    Und zwar möchte ich einen Screenshot aus einem fest definierten Bereich erstellen;
    als Grundlage hierfür verwende ich von pastl verwendete Tool "ScreenShot.exe " <- Link

    Dies ist mein momentaner Quellcode:

    [autoit]


    Func Screen()
    FileInstall("captdll.dll", @TempDir & "\captdll.dll")
    If Not FileExists (@DesktopDir & "Screenshots") Then DirCreate (@DesktopDir & "Screenshots")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $CaptureDirectory = @DesktopDir & "Screenshots"
    Local $CaptureFile = @MDAY & "-" & @MON & "-" & @YEAR & "_" & @HOUR & "." & @MIN &"." & @SEC & ".jpg"
    DllCall(@TempDir & "\captdll.dll", "int", "CaptureRegion", "str", $CaptureDirectory & $CaptureFile, "int", 263, "int", 497, "int", 830, "int", 377 "int", 100)
    If @error Then MsgBox(262160,"Fehler","Es wurde kein Screenshot erstellt!",4)

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]

    Das ist der Fehlercode den ich erhalte:

    Zitat

    C:\Programme\AutoIt3\Auswertung\Compare.au3(100,157) : ERROR: syntax error
    DllCall(@TempDir & "\captdll.dll", "int", "CaptureRegion", "str", $CaptureDirectory & $CaptureFile, "int", 263, "int", 497, "int", 830, "int", 377 "int"

    Ich glaube das es was mit den Qualitätseinstellungen zu tun hat, aber vielleicht gibt es ja Spezis die sich damit etwas besser auskennen ;)

    3 Mal editiert, zuletzt von dRoZ (26. August 2011 um 08:25)

  • du hast ein Komma vergessen ;) Hinter 377

    [autoit]

    DllCall(@TempDir & "\captdll.dll", "int", "CaptureRegion", "str", $CaptureDirectory & $CaptureFile, "int", 263, "int", 497, "int", 830, "int", 377, "int", 100)

    [/autoit]
  • Ein Screenshot wird bereits erstellt, warum aber hört er direkt nach Verwendung von captdll.dll auf
    und arbeitet nicht weiter die Befehle ab?

    [autoit]


    ...

    [/autoit][autoit][/autoit][autoit]

    While True
    If isArray(PixelSearch( 263, 497, 1073, 805, 0x000000, 100)) Then
    Local $Quality = 100
    If $Quality = -1 Then
    Local $SaveAs = ".bmp"
    Else
    Local $SaveAs = ".jpg"
    EndIf
    Local $CaptureDirectory = @DesktopDir & "\Screenshots"
    Local $CaptureFile = @MDAY & "-" & @MON & "-" & @YEAR & "_" & @HOUR & "." & @MIN &"." & @SEC & $SaveAs
    ;DllCall("captdll.dll", "int", "CaptureRegion", "str", $CaptureDirectory & $CaptureFile, "int", $left, "int", $top, "int", $with, "int", $height, "int", $Quality)
    DllCall("captdll.dll", "int", "CaptureRegion", "str", $CaptureDirectory & "\" & $CaptureFile, "int", 263, "int", 497, "int", 830, "int", 377, "int", 100)
    $fehler = @error

    [/autoit][autoit][/autoit][autoit]

    switch $fehler
    Case 0
    MsgBox(1, "", "Screenshot erfolgreich erstellt!", 10)
    Case 1
    MsgBox(1, "", "Kann die DLL '" & @TempDir & "\captdll.dll" & "' nicht finden!", 10)
    Case 2
    MsgBox(1, "", "Unbekannter Rückgabewert!", 10)
    Case 3
    MsgBox(1, "", "Funktion in DLL '" & @TempDir & "\captdll.dll" & "' nicht bekannt!", 10)
    Case 4
    MsgBox(1, "", "Falsche Anzahl Parameter!", 10)
    Case Else
    MsgBox(1, "", "Unbekannter Fehler!", 10)
    EndSwitch
    Exitloop
    Else

    [/autoit][autoit][/autoit][autoit]

    EndIf
    Sleep(5000)
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Sleep(8000)

    [/autoit][autoit][/autoit][autoit]

    Send("{PGUP}{PGUP}")
    Sleep(3000)
    MouseClick("primary", 400, 393)
    Sleep(1000)
    MouseClick("primary", 425, 447)
    Sleep(1000)

    [/autoit][autoit][/autoit][autoit]

    ...

    [/autoit]

    Er gibt weder den "Fehler-Code" aus, noch macht er weiter mit PageUp etc, aber das Bild wurde erstellt?!

  • Warum nutz du nicht die Boardmittel? Die Größe des Fesnters muss noch geändert werden. :)

    [autoit]


    #include <ScreenCapture.au3>
    Func Screen()

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists (@DesktopDir & "\Screenshots") Then DirCreate (@DesktopDir & "\Screenshots")

    [/autoit][autoit][/autoit][autoit]

    Local $CaptureDirectory = @DesktopDir & "\Screenshots\"
    Local $CaptureFile = @MDAY & "-" & @MON & "-" & @YEAR & "_" & @HOUR & "." & @MIN &"." & @SEC & ".jpg"

    [/autoit][autoit][/autoit][autoit]

    _ScreenCapture_Capture($CaptureDirectory & $CaptureFile, 0, 0, 640, 400)
    If @error Then MsgBox(262160,"Fehler","Es wurde kein Screenshot erstellt!",4)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Warum nutz du nicht die Boardmittel? Die Größe des Fesnters muss noch geändert werden. :)

    [autoit]


    #include
    Func Screen()

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists (@DesktopDir & "\Screenshots") Then DirCreate (@DesktopDir & "\Screenshots")

    [/autoit] [autoit][/autoit] [autoit]

    Local $CaptureDirectory = @DesktopDir & "\Screenshots\"
    Local $CaptureFile = @MDAY & "-" & @MON & "-" & @YEAR & "_" & @HOUR & "." & @MIN &"." & @SEC & ".jpg"

    [/autoit] [autoit][/autoit] [autoit]

    _ScreenCapture_Capture($CaptureDirectory & $CaptureFile, 0, 0, 640, 400)
    If @error Then MsgBox(262160,"Fehler","Es wurde kein Screenshot erstellt!",4)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Ich benutze es so weil es bis jetzt ja auch ganz gut geklappt hat, es
    geht mir ja vielmehr darum dass das Programm nicht fortfährt : /

  • Scheint momentan ja niemand hier helfen zu können,
    Vielleicht eine etwas blöde frage, aber kann es mit der captdll.dll
    zu tun haben?
    Vielleicht eine unverträgliche Version?
    Meine Datei ist von Mittwoch, 16. Februar 2005, 22:13:40
    Sollte ich Ausschau nach einer neueren Version halten, bzw. wo würde
    ich eine neuere Version davon finden?

  • Schaue mal hier rein: AutoIt Windows Screenshooter v1.29 Build 2011-08-16 Final

    Ich benutze keinerlei DLLs!

    Wenn ich Zeit finde, werde ich noch das Freihand Markieren des Desktop Bereiches implementieren.

    Gruß,
    UEZ

    Hallo,

    zum Freihandmarkieren kannst Du evtl. das hier gebrauchen:

    [autoit]


    #include <WindowsConstants.au3>
    #include <Timers.au3>
    #Include <Misc.au3>
    #Include <ScreenCapture.au3>

    [/autoit][autoit][/autoit][autoit]

    global $s_left = 0, $s_top = 0, $s_width = 0, $s_height = 0, $s_right = 0, $s_down = 0
    func area()
    $GUI_2 = GUICreate("", 1, 1, -1, -1, 0x80000000 + 0x00800000, 0x00000008)
    GUISetBkColor(0x0c6eec)
    WinSetTrans($GUI_2, "", 130)
    local $s_left = 0, $s_top = 0, $s_width = 0, $s_height = 0, $s_right = 0, $s_down = 0, $mgp[2]
    $mpos = MouseGetPos()
    Local $hGUI_Cross = GUICreate("", 30, 30, $mpos[0], $mpos[1], $WS_POPUP, $WS_DISABLED + $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    GUISetState(@SW_SHOW, $hGUI_Cross)
    WinSetTrans($hGUI_Cross, "", 1)
    GUISetCursor(3)
    $i = _Timer_Init()
    While Not _IsPressed(01)
    $mgp = MouseGetPos()
    WinMove($hGUI_Cross, "", $mgp[0] - 15, $mgp[1] - 15)
    Sleep(20)
    WEnd
    WinMove($GUI_2, "", $mgp[0], $mgp[1], 1, 1)
    GUISetState(@SW_SHOW, $GUI_2)
    if _IsPressed(01) then
    While _IsPressed(01)
    $mgp_2 = MouseGetPos()
    If $mgp_2[0] > $mgp[0] And $mgp_2[1] > $mgp[1] Then
    local $s_left = $mgp[0], $s_top = $mgp[1], $s_width = $mgp_2[0] - $mgp[0], $s_height = $mgp_2[1] - $mgp[1], $s_right = $mgp_2[0], $s_down = $mgp_2[1]
    ElseIf $mgp_2[0] > $mgp[0] And $mgp_2[1] < $mgp[1] Then
    Local $s_left = $mgp[0], $s_top = $mgp_2[1], $s_width = $mgp_2[0] - $mgp[0], $s_height = $mgp[1] - $mgp_2[1], $s_right = $mgp_2[0], $s_down = $mgp[1]
    ElseIf $mgp_2[0] < $mgp[0] And $mgp_2[1] > $mgp[1] Then
    Local $s_left = $mgp_2[0], $s_top = $mgp[1], $s_width = $mgp[0] - $mgp_2[0], $s_height = $mgp_2[1] - $mgp[1], $s_right = $mgp[0], $s_down = $mgp_2[1]
    ElseIf $mgp_2[0] < $mgp[0] And $mgp_2[1] < $mgp[1] Then
    Local $s_left = $mgp_2[0], $s_top = $mgp_2[1], $s_width = $mgp[0] - $mgp_2[0], $s_height = $mgp[1] - $mgp_2[1], $s_right = $mgp[0], $s_down = $mgp[1]
    EndIf
    WinMove($GUI_2, "", $s_left, $s_top, $s_width, $s_height)
    ToolTip($s_width & "x" & $s_height)
    sleep(5)
    WEnd
    endif
    ToolTip("")
    GUIDelete($hGUI_Cross)
    GLOBAL $s_left = $s_left, $s_top = $s_top, $s_width = $s_width, $s_height = $s_height, $s_right = $s_right, $s_down = $s_down
    GUIDelete($GUI_2)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    area()
    $hBitmap = _ScreenCapture_Capture(@DesktopDir&"\test.jpg", $s_left, $s_top, $s_right, $s_down, false)

    [/autoit]

    Sonnige Grüße, Andy

  • Ich verstehen nicht warum du nicht die Funktion _ScreenCapture_Capture benutz, klar ging es mit der DLL zuvor, nun aber nicht mehr und da ist es doch deutlich einfacher, eine Befehl aus AutoIt zu nutzen, als sich große gedanken über alte DLL zu machen.