Mal Script ist Langsam - Warum??

  • Hallo,
    ich habe wieder einmal eine Frage:

    Ich habe mir ein Script geschrieben, mit dem man einen Bereich mit 2 Tastenkombinationen definiert, und wenn man Alt+S drückt, dann wird Paint geöffnet und der zuerst definierte bereich wird dann nachgezeichnet.
    Ich habe das so gemacht, dass ich zuerst die Farben von jedem Pixel im Bereich in ein Array speichere und dann stelle ich bei Paint immer die Farbe so ein und male mit dem Stift einen punkt und dann immer weiter.

    Jetzt meine Frage:
    Bei dem Einlesen der Farben in das Array, braucht mein Script sehr lange, kann mir jemand sagen warum??

    Hier der code:

    Spoiler anzeigen
    [autoit]


    Opt("WinTitleMatchMode", 2)

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

    #include <Color.au3>

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

    Local $ObenX, $ObenY, $UntenX, $UntenY, $GroesseX, $GroesseY, $Quelle

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

    ;61, 94

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

    HotKeySet("!1", "Oben")
    HotKeySet("!2", "Unten")
    HotKeySet("!p", "Pause")
    HotKeySet("!s", "Start")
    HotKeySet("{ESC}", "_Exit")

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

    While 1
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func Pause()
    While 1
    WEnd
    EndFunc

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

    Func Oben()
    $Pos = MouseGetPos()
    $ObenX = $Pos[0]
    $ObenY = $Pos[1]
    EndFunc

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

    Func Unten()
    $Pos = MouseGetPos()
    $UntenX = $Pos[0]
    $UntenY = $Pos[1]
    EndFunc

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

    Func Start()
    $Quelle = WinGetTitle("")
    $GroesseX = $UntenX - $ObenX
    $GroesseY = $UntenY - $ObenY
    Dim $Farbe[$GroesseY][$GroesseX]
    WinActivate($Quelle)
    For $i = 0 To $GroesseY - 1
    For $j = 0 To $GroesseX - 1
    $Farbe[$i][$j] = PixelGetColor($ObenX + $j, $ObenY + $i)
    Next
    Next
    Run("mspaint.exe")
    WinWaitActive("Paint")
    For $i = 0 To $GroesseY - 1
    For $j = 0 To $GroesseX - 1
    Send("!F")
    Send("p")
    Send("!d")
    ControlSetText("", "", 706, _ColorGetRed($Farbe[$i][$j]))
    ControlSetText("", "", 707, _ColorGetGreen($Farbe[$i][$j]))
    ControlSetText("", "", 708, _ColorGetBlue($Farbe[$i][$j]))
    ControlClick("", "OK", 1)
    MouseClick("left", 71 + $j, 104 + $i)
    Next
    Next
    MsgBox(64, "Info", "Fertig")
    EndFunc

    [/autoit]
  • Ich wollte nur wissen, ob man das mit dem Farbenspeichern in das Array, etwas beschleunigen kann, oder meinst du den Sinn des programms? ^^

  • Aso ^^
    Naja, ich wollte unbedingt etwas mit AutoIt machen, aber mir ist noch nichts eingefallen, jetzt bin ich auf diese Idee gekommen ^^

    • Offizieller Beitrag

    Ja, aber was ist der Sinn / Ziel? Was soll es werden sein wenn es fertig ist.

    Malen kannst du auch so:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #Include <GDIPlus.au3>

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

    _GDIPlus_Startup ()

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

    $hDC = _WinAPI_GetWindowDC(0)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC)
    $Color = 0xFF000000
    $hPen = _GDIPlus_PenCreate($Color,2)

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

    For $y = 0 to 300
    For $x = 0 to @DesktopWidth Step 5
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth/2, 0, $x, @DesktopHeight, $hPen)
    $Color += Hex(2)
    _GDIPlus_PenSetColor($hPen, $Color)
    Next
    Next
    Sleep(5000)

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

    _WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE+$RDW_ALLCHILDREN)
    _WinAPI_ReleaseDC(0, $hDC)
    _GDIPlus_Shutdown()

    [/autoit]

    Mega

  • Naja, eigentlich wollte ich nur das der Bereich einfach in Paint gezeichnet wird, mehr nicht^^

    Ist ja interessant, mit dem habe ich mich noch nicht so beschäftigt, ist wirklich Krass gemacht.
    Sieht aber kompliziert aus -.-
    Thx für das Skript, werd ich mir mal durchschauen.

    [EDIT]: Gibt es für das auch ein kleines Tut?
    Wäre echt toll, das interessiert mich nämlich sehr.

    Einmal editiert, zuletzt von morfi93 (5. Juni 2008 um 22:31)

  • Ich hätte auch noch 2 Möglichkeiten: Screenshot über die Zwischenablage oder Screenshot über eine Datei:
    Benötigt ImageClip UDF und folgende Includes:
    #include <ImageClip.au3>
    #include <ScreenCapture.au3>

    Spoiler anzeigen
    [autoit]

    Func Start()
    Local $bmp = _ScreenCapture_Capture("",$ObenX,$ObenY,$UntenX,$UntenY)
    Run("mspaint.exe")
    WinWaitActive("Paint")
    $Paint = WinGetHandle("Paint")
    ControlSend($Paint,"","Afx:1000000:81","^e")
    WinWaitActive("Attribute")
    ControlSetText("Attribute","","Edit1",1)
    ControlSetText("Attribute","","Edit2",1)
    ControlSend("Attribute","","","{ENTER}")
    WinWaitClose("Attribute")
    WinActivate($Paint)
    WinWaitActive($Paint)
    _ClipBoard_SetHBITMAP($bmp)
    _WinAPI_DeleteObject($bmp)
    ControlSend("Paint","","Afx:1000000:81","^v")
    MsgBox(64, "Info", "Fertig")
    EndFunc

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

    Func Start2()
    Local $bmp = _ScreenCapture_Capture(@TempDir & "\TempScreencap.bmp",$ObenX,$ObenY,$UntenX,$UntenY)
    ShellExecute("mspaint.exe",@TempDir & "\TempScreencap.bmp")
    WinWaitActive("Paint")
    MsgBox(64, "Info", "Fertig")
    EndFunc

    [/autoit]