Что нового

[Мышь, клавиатура] Альтернатива MouseMove

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Функция которую хочу сделать, аналог стандартному MouseMove(), но чуть больше параметров, и главное во время движения курсора можно будет выполнять попутно еще какой то код (проверки пикселей и т.д).
Помогите сделать вычисления для координаты $y


Код:
_MouseMove(@DesktopWidth/2, @DesktopHeight/2)

Func _MouseMove($x, $y, $speed = 10, $Step = 1)
	$speed = $speed/10
	Local $pos = MouseGetPos()

	If $pos[0] > $x Then $Step = -$Step
	For $ix = $pos[0] To $x Step $Step

		MouseMove($ix, $y, 0)


;попутный код...
		_Sleep($speed)
	Next
EndFunc


Func _Sleep($time_Sleep);можно ставить значения меньшие чем в стандартном Sleep()
    Local $Timer = TimerInit()
    While TimerDiff($Timer) <= $time_Sleep
    WEnd
EndFunc





Решил задачку так: :laugh:
Код:
_MouseMove(@DesktopWidth/2, @DesktopHeight/2, 10, 2)

Func _MouseMove($x, $y, $speed = 10, $Step = 1)
	$speed = $speed/10
    Local $pos = MouseGetPos()
	If  Abs($x - $pos[0]) > Abs($pos[1]-$y) Then
		Local $k = ($x - $pos[0]) / ($pos[1]-$y)
		If $pos[0] > $x Then $Step = -$Step
		For $ix = $pos[0] To $x Step $Step
			MouseMove($ix, $pos[1] - ($ix-$pos[0])/$k , 0)
			_Sleep($speed)
		Next
	Else
		Local $k =  ($pos[1]-$y) / ($x - $pos[0])
		If $pos[1] > $y Then $Step = -$Step
		For $iY = $pos[1] To $y Step $Step
			MouseMove($pos[0] - ($iY-$pos[1])/$k, $iY , 0)
			_Sleep($speed)
		Next
	EndIf
EndFunc

Func _Sleep($time_Sleep);можно ставить значения меньшие чем в стандартном Sleep()
    Local $Timer = TimerInit()
    While TimerDiff($Timer) <= $time_Sleep
    WEnd
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Честно говоря не понимаю зачем это нужно :shok:
 
Автор
R

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Какое id? Откуда оно берётся?
:smile: Это к теме не относится... id курсора я определять буду этой функцией: _WinAPI_GetCursorInfo()
Пока мне нужно сделать чтобы курсор перемещался из точки А в точку Б

И еще к вопросу "зачем это нужно" , параметр Step который отсутствует в стандартном MouseMove () тоже мне важен.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Пока мне нужно сделать чтобы курсор перемещался из точки А в точку Б
Так сойдет ?:
Код:
_WinAPI_SetCursorPos(100, 100)

Func _WinAPI_SetCursorPos($iX, $iY)
	DllCall("user32.dll", "bool", "SetCursorPos", "int", $iX, "int", $iY)
EndFunc


А что должен делать параметр Step ?
 
Автор
R

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Нет, мне нужно чтобы именно в цикле, как у меня в примере, передвигался курсор.
Я не знаю как мне вычислить Y координату.
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Ллллови
Код:
#include <Misc.au3>
HotKeySet("{Esc}", "_Exit")
Func _Exit()
    Exit
EndFunc

_MouseMove(@DesktopWidth/2, @DesktopHeight/2)

Func _MouseMove($x, $y, $speed = 10, $Step = 1)
    $speed = $speed/10
    Local $pos = MouseGetPos()
	If $x>$y Then
		$cnt = Abs($x-$pos[0])/$Step
	ElseIf $y>$x Then
		$cnt = Abs($y-$pos[1])/$Step
	Else
		$cnt = Abs($x-$pos[0])/$Step
	EndIf
	$speedx = Abs($x-$pos[0])/$cnt
	$speedy = Abs($y-$pos[1])/$cnt
    For $i = 1 To $cnt
        MouseMove($pos[0]+_Iif($x<$pos[0],-$speedx*$i,$speedx*$i), $pos[1]+_Iif($y<$pos[1],-$speedy*$i,$speedy*$i), 0)
        _Sleep($speed)
    Next
EndFunc


Func _Sleep($time_Sleep);можно ставить значения меньшие чем в стандартном Sleep()
    Local $st_Sleep = TimerInit()
    While 1
        If TimerDiff($st_Sleep) >= $time_Sleep Then
            ExitLoop
        EndIf
    WEnd
EndFunc
 
Автор
R

rusreg79

Продвинутый
Сообщения
159
Репутация
57
2 Nik_rus
Есть в твоем скрипте такая особенность, если курсор перемещается вертикально , то скорость возрастает до мгновенного перемещения.

PS.Поставленную задачу в теме решил сам, небольшой отдых от кодинга просветляет :smile:
Код:
_MouseMove(@DesktopWidth/2, @DesktopHeight/2, 10, 2)

Func _MouseMove($x, $y, $speed = 10, $Step = 1)
    $speed = $speed/10
    Local $pos = MouseGetPos()
    If  Abs($x - $pos[0]) > Abs($pos[1]-$y) Then
        Local $k = ($x - $pos[0]) / ($pos[1]-$y)
        If $pos[0] > $x Then $Step = -$Step
        For $ix = $pos[0] To $x Step $Step
            MouseMove($ix, $pos[1] - ($ix-$pos[0])/$k , 0)
            _Sleep($speed)
        Next
    Else
        Local $k =  ($pos[1]-$y) / ($x - $pos[0])
        If $pos[1] > $y Then $Step = -$Step
        For $iY = $pos[1] To $y Step $Step
            MouseMove($pos[0] - ($iY-$pos[1])/$k, $iY , 0)
            _Sleep($speed)
        Next
    EndIf
EndFunc

Func _Sleep($time_Sleep);можно ставить значения меньшие чем в стандартном Sleep()
    Local $Timer = TimerInit()
    While TimerDiff($Timer) <= $time_Sleep
    WEnd
EndFunc
 
Верх