Что нового

Идея для UDF - распознавание движений мышки

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Возникла отличная идея для создания новой библиотеки и расширения функционала AutoIt.

В некоторых программах реализована функция распознавания движений мышки. Например, в браузере Opera: http://ru.wikibooks.org/wiki/Opera/Жесты_мышью

Предлагаю реализовать подобное в AutoIt. Это сложная задача, но вдруг кто-то возьмется? 8)

В идеале должно выглядеть так:

Код:
#include <mousemoves.au3>

;~ Если зажать ALT и повести мышку вправо, то выполнить func1()
_mousemoves("!>", "func1")   

;~ Если мышку двинули влево, а потом вправо, то выполнить func2()
_mousemoves("<>", "func2")   

;~ Если зажали ALT и двинули мышку двинули вверх, то выполнить func3()
_mousemoves("!/\", "func3")   


;~ При быстром движении мышки вправо, то выполнить func4()
_mousemoves(">>", "func4")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Для этого уже есть две библиотеки:

_IsPressedEx - Расширенная функция для определения нажатых клавиш
MouseSetOnEvent - Обработка событии мышки

Вот слеплены из них (“грубый” надо заметить) пример:

Код:
#include <MouseSetOnEvent.au3>
#include <IsPressedEx.au3>

Global $__aMouseSetGesture_LastCoords = -1

 _MouseSetGesture("{Ctrl}", "Right,Up", "_Gesture_RightUp_Proc")

Sleep(10000)

Func _MouseSetGesture($sModifiers, $sGestures, $sFuncName)
	Local $aGestures_Param[2] = [$sGestures, $sFuncName]
	_MouseSetOnEvent($MOUSE_MOVE_EVENT, "__MouseSetGesture_Handler", $sModifiers, $aGestures_Param, 0, 0)
EndFunc

Func __MouseSetGesture_Handler($sModifiers, $aGestures_Param)
	Local $aMousePos, $sGestures, $sFuncName, $iGesture_Left, $iGesture_Right, $iGesture_Up, $iGesture_Down
	
	If $sModifiers <> "" And Not _IsPressedEx($sModifiers) Then
		Return 0
	EndIf
	
	$aMousePos = MouseGetPos()
	$sGestures = $aGestures_Param[0]
	$sFuncName = $aGestures_Param[1]
	
	If Not IsArray($__aMouseSetGesture_LastCoords) Then
		$__aMouseSetGesture_LastCoords = $aMousePos
		Return 0
	EndIf
	
	$iGesture_Left = (StringInStr($sGestures, "Left") > 0)
	$iGesture_Right = (StringInStr($sGestures, "Right") > 0)
	$iGesture_Up = (StringInStr($sGestures, "Up") > 0)
	$iGesture_Down = (StringInStr($sGestures, "Down") > 0)
	
	; Mouse moved to the Left
	If (($iGesture_Left And $aMousePos[0] < $__aMouseSetGesture_LastCoords[0]) Or Not $iGesture_Left) And _
		(($iGesture_Right And $aMousePos[0] > $__aMouseSetGesture_LastCoords[0]) Or Not $iGesture_Right) And _
		(($iGesture_Up And $aMousePos[1] < $__aMouseSetGesture_LastCoords[1]) Or Not $iGesture_Up) And _
		(($iGesture_Down And $aMousePos[1] > $__aMouseSetGesture_LastCoords[1]) Or Not $iGesture_Down) Then
		
		;$__aMouseSetGesture_LastCoords = -1
		
		Call($sFuncName)
	EndIf
EndFunc

Func _Gesture_RightUp_Proc()
	ConsoleWrite('<Ctrl + Right-Up> Gesture recieved!' & @LF)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Прикольно! А в другие стороны? :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Suppir [?]
А в другие стороны?
Код:
_MouseSetGesture("{Ctrl}", "Left,Down", "_Gesture_LeftDown_Proc")

...

Func _Gesture_LeftDown_Proc()
    ConsoleWrite('<Ctrl + Left-Down> Gesture recieved!' & @LF)
EndFunc


:smile:
 
Верх