Что нового

[Автоматизация] Сохранить несколько координат мыши в переменные

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Нужно сохранить 8 разных координат в переменные.
Текущий скрипт, как я понял, изменить не получится и придется писать с 0.
Как сохранить 1 координату я знаю, но как сохранить несколько.. меня это ставит в тупик, потому что нужно будет по ним мышку гонять.
Вот мой скрипт
Код:
HotKeySet("{1}", "_1")
HotKeySet("{2}", "_2")
HotKeySet("{3}", "_3")
HotKeySet("{4}", "_4")
HotKeySet("{5}", "_5")
HotKeySet("{6}", "_6")
HotKeySet("{7}", "_7")
HotKeySet("{8}", "_8")
HotKeySet("{8}", "_9")
HotKeySet("{0}", "_Exit")

Global $MousePos[2]

While 1
    Sleep(10)
WEnd

Func _1()
    _SaveCoords()
    MouseClick("left", 561, 243, 1, 0)
    MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _2()
	_SaveCoords()
	MouseClick("left", 621, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _3()
	_SaveCoords()
	MouseClick("left", 671, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _4()
	_SaveCoords()
	MouseClick("left", 731, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _5()
	_SaveCoords()
	MouseClick("left", 791, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _6()
	_SaveCoords()
	MouseClick("left", 851, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _7()
	_SaveCoords()
	MouseClick("left", 921, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _8()
	_SaveCoords()
	MouseClick("left", 981, 243, 1, 0)
	MouseClick("left",$MousePos[0],$MousePos[1], 1, 0)
EndFunc

Func _SaveCoords()
    $MousePos = MouseGetPos()
EndFunc

Func _Exit()
    Exit
EndFunc
По нему видно, что первый клик мышка делает по заранее заданным координатам, а затем по последней сохраненной.

Я примерно набросал, как это должно выглядеть, но после, просто запутался.

Сохранение координаты
Код:
Global $MousePos[2]
$MousePos = MouseGetPos()

Получается, придется сделать так
Код:
HotKeySet("{1}", "_1")
HotKeySet("{2}", "_2")
HotKeySet("^1", "_c1")
HotKeySet("^2", "_c2")
Global $MousePos[2], $Coord1[2], $Coord2[2]

Func _1()
    _SaveCoords()
    MouseClick("left", $Coord1[0], $Coord1[1], 1, 0)
    MouseClick("left", $MousePos[0], $MousePos[1], 1, 0)
EndFunc

Func _2()
    _SaveCoords()
    MouseClick("left", $Coord2[0], $Coord2[1], 1, 0)
    MouseClick("left", $MousePos[0], $MousePos[1], 1, 0)
EndFunc

Func _c1()
	$Coord1 = MouseGetPos()
EndFunc

Func _c2()
	$Coord2 = MouseGetPos()
EndFunc

Func _SaveCoords()
    $MousePos = MouseGetPos()
EndFunc

И для сохранения каждой координаты нужна будет отдельная функция, получается слишком громоздко.
Можно ли как то сократить скрипт?
 

Shinoby

Новичок
Сообщения
81
Репутация
2
если нужно запомнить 8 координат мыши, значит нужно создать 8 переменных. например $MousePos1, $MousePos2.....

а в каждой из функий _1, _2 вместо _SaveCoords() пиши так:
Код:
$MousePos1 = MouseGetPos()
.
.
.
$MousePos2 = MouseGetPos()


разбирайтесь.

можно было бы запустить все цикле, но тогда не будет гибкости на случай, если запомнили не ту координату.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gloss [?]
Нужно сохранить 8 разных координат в переменные.
Можно примерно так сделать.
Код:
Global $aMouse[9][2], $aCoord[9][2] = [[0],[561, 243],[621, 243],[671, 243],[791, 243],[851, 243],[981, 243],[123, 123],[234, 123]]

HotKeySet('1', '_MyFunc')
HotKeySet('{Esc}', '_Exit')

While Sleep(100)
WEnd

Func _MyFunc()
	If $aCoord[0][0] = 8 Then $aCoord[0][0] = 0
	_SaveMousePos()
	$aCoord[0][0] += 1
	MouseClick('primary', $aCoord[$aCoord[0][0]][0], $aCoord[$aCoord[0][0]][1], 1, 0)
	MouseClick('primary', $aMouse[$aCoord[0][0]][0], $aMouse[$aCoord[0][0]][1], 1, 0)
EndFunc   ;==>_MyFunc


Func _SaveMousePos()
	If $aMouse[0][0] = 8 Then Return
	Local $a_MousePos = MouseGetPos()
	$aMouse[0][0] += 1
	For $i = 0 To 1
		$aMouse[$aMouse[0][0]][$i] = $a_MousePos[$i]
	Next
EndFunc   ;==>_SaveMousePos

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
madmasles, Вы меня немного не так поняли, я имел в виду вместо заранее заданных координат сделать их запоминание. Т.е. никаких [561, 243],[621, 243]... в скрипте быть не должно, вместо них переменные куда будем запоминать координаты по нажатию на хоткеи, а именно Ctrl+1=первая координата, Ctrl+2=вторая координата и т.д.

И Ваш вариант я совсем не понимаю :stars:
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
C2H5OH, Нет, не трогал
Edit: Запустил, не работает. По нажатию на 1 последовательно прыгает по координатам и все :whistle:
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Без HotKeySet():
Код:
#include <Misc.au3>

HotKeySet("{ESC}", "_Exit")
Global $aKeys[9][2]
Global $aTemp

$aTemp = MouseGetPos()
For $i = 0 To 8
	$aKeys[$i][0] = $aTemp[0]
	$aKeys[$i][1] = $aTemp[1]
Next

While 1
	$sText = ''
	For $i = 1 To 8
		If _IsPressed("3" & $i) Then
			$aTemp = MouseGetPos()
			If _IsPressed('A2') Then
				$aKeys[$i][0] = $aTemp[0]
				$aKeys[$i][1] = $aTemp[1]
			Else
				$aKeys[0][0] = $aTemp[0]
				$aKeys[0][1] = $aTemp[1]
				;MouseMove($aKeys[$i][0], $aKeys[$i][1])
				MouseClick("primary", $aKeys[$i][0], $aKeys[$i][1])
				;MouseMove($aKeys[0][0], $aKeys[0][1])
				MouseClick("primary", $aKeys[0][0], $aKeys[0][1])
			EndIf
			ExitLoop
		EndIf
	Next

	For $i = 1 To 8
		$sText &= $i & ' - (' & $aKeys[$i][0] & ', ' & $aKeys[$i][1] & ')' & @CRLF
	Next
	TrayTip('', StringTrimRight($sText, 2), 500)
	Sleep(10)
WEnd

Func _Exit()
	Exit
EndFunc
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar, WinAPISys.au3 отсутствует, толковых ссылок я не нашел
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
gloss
Извиняюсь, исправил пост выше. Она вообще не нужна.
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar
Не могу понять как это работает :scratch:
UFVFtWp.jpg
Edit Понял, отображает координаты мышки при запуске скрипта, но не понятно как их менять самому :stars:
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
gloss
Ctrl-1 до Ctrl-8 изменяют
Клавиши от 1 до 8 кликают два раза (на установленной ранее, затем на предыдущем положении курсора)

Вам же так надо было?
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar
Я пробовал изменить координаты, но не вышло

Окей, попробовал еще раз. Как убрать тултип, почему при назначении координат мышка пытается ткнуть в то место и зачем она водит по экрану?
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
gloss
У меня в XP все работает. Может так:
Код:
#include <Misc.au3>
#RequireAdmin

HotKeySet("{ESC}", "_Exit")
Global $aKeys[9][2]
Global $aTemp
Global $hUser32 = DllOpen('user32.dll')

$aTemp = MouseGetPos()
For $i = 0 To 8
    $aKeys[$i][0] = $aTemp[0]
    $aKeys[$i][1] = $aTemp[1]
Next

While 1
    $sText = ''
    For $i = 1 To 8
        If _IsPressed("3" & $i, $hUser32) Then
            If _IsPressed('A2') Or _IsPressed('A3') Then
                $aTemp = MouseGetPos()
                $aKeys[$i][0] = $aTemp[0]
                $aKeys[$i][1] = $aTemp[1]
            Else
                $aTemp = MouseGetPos()
                $aKeys[0][0] = $aTemp[0]
                $aKeys[0][1] = $aTemp[1]
                ;MouseMove($aKeys[$i][0], $aKeys[$i][1])
                MouseClick("primary", $aKeys[$i][0], $aKeys[$i][1], 1, 0)
                ;MouseMove($aKeys[0][0], $aKeys[0][1])
                MouseClick("primary", $aKeys[0][0], $aKeys[0][1], 1, 0)
            EndIf
            ExitLoop
        EndIf
    Next

    ; Для отладки (можно удалить)
    For $i = 1 To 8
        $sText &= $i & ' - (' & $aKeys[$i][0] & ', ' & $aKeys[$i][1] & ')' & @CRLF
    Next
    TrayTip('', StringTrimRight($sText, 2), 500)
    ; Удалять до этого места

    Sleep(10)
WEnd
DllClose($hUser32)

Func _Exit()
    Exit
EndFunc
Может еще из-за 64 битной ОС.
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar
Без изменений, может из-за Win8?

А и хрен с ним, значит в моем случае "краткость не сестра таланта" ;D
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
В Win7 64 - все работает
Ну а пример указанный в вопросе, с применением HotKeySet("^1", "_c1"), работает?
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar
Да, я сам его и сделал.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Тогда так может заработает:
Код:
#include <Misc.au3>
#RequireAdmin

Opt('MouseClickDelay', 100) ; Время зажатия кнопки мыши (по уьолчанию 10 мс)

Global $aKeys[9][2]
Global $aTemp
Global $hUser32 = DllOpen('user32.dll')
Global $sText ; Переменная для отладки

HotKeySet("{ESC}", "_Exit")
For $i = 1 To 8
	Execute('HotKeySet("' & $i & '", "KeyPressed")')
	Execute('HotKeySet("^' & $i & '", "KeyAssign")')
Next

$aTemp = MouseGetPos()
For $i = 0 To 8
    $aKeys[$i][0] = $aTemp[0]
    $aKeys[$i][1] = $aTemp[1]
Next

While 1
    ; Для отладки (можно удалить)
	$sText = ''
    For $i = 1 To 8
        $sText &= $i & ' - (' & $aKeys[$i][0] & ', ' & $aKeys[$i][1] & ')' & @CRLF
    Next
    TrayTip('', StringTrimRight($sText, 2), 500)
    ; Удалять до этого места
	Sleep(500)
WEnd

Func _Exit()
	Exit
EndFunc

Func KeyPressed()
	For $i = 1 To 8
		If _IsPressed('3' & $i, $hUser32) Then
			$aTemp = MouseGetPos()
			$aKeys[0][0] = $aTemp[0]
			$aKeys[0][1] = $aTemp[1]
			MouseClick('primary', $aKeys[$i][0], $aKeys[$i][1], 1, 0)
			MouseClick('primary', $aKeys[0][0], $aKeys[0][1], 1, 0)
			ExitLoop
		EndIf
	Next
EndFunc

Func KeyAssign()
	For $i = 1 To 8
		If _IsPressed('3' & $i, $hUser32) Then
			$aTemp = MouseGetPos()
			$aKeys[$i][0] = $aTemp[0]
			$aKeys[$i][1] = $aTemp[1]
			ExitLoop
		EndIf
	Next
EndFunc
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Z_Lenar
Я уже написал для себя длиннющий вариант, зато 100% работающий
 
Верх