Mouse Move verlangsamen

  • Hi, nur ne kurze Frage:
    Ich will, dass der MouseMove mit einer konstanten Geschwindigkeit den Cursor bewegt.

    Das Prog. ist ganz klein.
    Ich brauch es lediglich, um bei Paint.NET ein recht großes Bild
    langsam nach unten zu scrollen, da das mit nem prog. besser geht als mit der Hand. (Für ein Video).

    Achso, hier das script:

    [autoit]


    HotKeySet ("{Numpad1}", "_Go")
    HotKeySet ("{Numpad2}", "_Exit")

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

    While 1

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

    WEnd

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

    Func _Exit ()
    Exit
    EndFunc

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

    Func _Go ()
    MouseMove (1270, 180)
    Sleep (100)
    MouseDown ("left")
    Sleep (100)
    MouseMove (1270, 920, 100)
    MouseUp ("left")
    EndFunc

    [/autoit]
  • Schau die die Hilfe an. Dort siehst du, dass MouseMove einen 3. Parameter hat und der heisst "speed". Und das ist so ziemlich das was du suchst oder?

    Gruss Shadowigor

  • Die Interpolation zwischen Start- und Zielpunkt ist vermutlich AutoIt-intern und kann soweit ich weiß nicht verändert werden.
    Ich hab mal eine kleine Funktion gebastelt die in etwa das machen sollte was du willst.
    Die ersten beiden Parameter stehen für die X und Y Zielkoordinaten. $nSpeed gibt die Geschwindigkeit an, aber dabei gibt es noch etwas zu beachten.
    Die Funktion hat nämlich 2 verschiedene Modi. Mode = 0 heißt, der Cursor bewegt sich mit einer konstanten Geschwindigkeit von $iSpeed (in Pixel pro Sekunde) zum Zielpunkt. Die Geschwindgkeit ist bei verschiedenen Streckenlängen gleich, d.h. längere Strecken nehmen auch mehr Zeit in Anspruch. Mode = 1 heißt, der Cursor bewegt sich innerhalb der von $iSpeed gegebenen Zeit (in Sekunden, nicht Millisekunden) zum Zielpunkt. Dadurch bewegt sich der Cursor immernoch mit konstanter Geschwindigkeit, aber diese wird bei längeren Strecken größer, sodass für jede Strecke die selbe Zeit benötigt wird.
    $nSmooth gibt die Anzahl der Schritte pro Sekunde an, in denen die Cursorposition aktualisiert wird. Eine höhere Zahl steht für eine flüssigere Bewegung, aber evtl. auch eine höhere CPU Auslastung, da mehr Berechnungen pro Sekunde durchgeführt werden.
    Für $iX_Dest, $iY_Dest sollten Integerzahlen verwendet werden, während $nSpeed und $nSmooth auch "Kommazahlen" akzeptieren.

    Spoiler anzeigen
    [autoit]

    Func _MouseMoveConstant($iX_Dest, $iY_Dest, $nSpeed, $iMode = 0, $nSmooth = 60)
    ;-Author: name22 (http://www.autoit.de)

    $vNTdll = DllOpen("ntdll.dll")
    $tPrecSleep = DllStructCreate("int64 time;")
    $pPrecSleep = DllStructGetPtr($tPrecSleep)
    $nSleepTime = 1000 / $nSmooth

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

    $aMousePos = MouseGetPos()
    $nX_Mov = $iX_Dest - $aMousePos[0]
    $nY_Mov = $iY_Dest - $aMousePos[1]
    $nD = Sqrt($nX_Mov ^ 2 + $nY_Mov ^ 2)
    Switch $iMode
    Case 0
    $nX_Mov = $nX_Mov / $nD * $nSpeed
    $nY_Mov = $nY_Mov / $nD * $nSpeed
    Case 1
    $nX_Mov = $nX_Mov / $nSpeed
    $nY_Mov = $nY_Mov / $nSpeed
    EndSwitch
    $nX_Pos = $aMousePos[0]
    $nY_Pos = $aMousePos[1]
    $nT = TimerInit()
    While True
    DllStructSetData($tPrecSleep, "time", -10000 * ($nSleepTime - TimerDiff($nT)))
    DllCall($vNTdll, "dword", "ZwDelayExecution", "int", 0, "ptr", $pPrecSleep)
    $nTime = TimerDiff($nT)
    $nT = TimerInit()
    $nFPS_Cur = 1000 / $nTime

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

    $nX_PosNew = $nX_Pos + $nX_Mov / $nFPS_Cur
    $nY_PosNew = $nY_Pos + $nY_Mov / $nFPS_Cur
    If Sqrt(($nX_PosNew - $aMousePos[0]) ^ 2 + ($nY_PosNew - $aMousePos[1]) ^ 2) >= $nD Then
    MouseMove($iX_Dest, $iY_Dest, 0)
    ExitLoop
    EndIf
    $nX_Pos = $nX_PosNew
    $nY_Pos = $nY_PosNew
    MouseMove($nX_Pos, $nY_Pos, 0)
    WEnd
    DllClose($vNTdll)
    EndFunc

    [/autoit]


    Es ist noch kein korrektes Errorhandling eingebaut, aber ich gehe davon aus, dass du für die einzelnen Paramter keinen Blödsinn eingibst ;).