Что нового

Мышь, клавиатура MouseOnEvent - Обработка событии мышки

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Re: MouseSetOnEvent - Обработка событии мышки

CreatoR,
Вы не могли бы показать пример, как назначить функцию на двойной клик мыши, как не пытался, у меня не получается.
Этот пример
Код:
#include "MouseOnEvent.au3"

$iPaused = False

_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT, "PausePlay")
Sleep(5000)
_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT)

Func PausePlay()
	$iPaused = Not $iPaused
	ConsoleWrite("Paused: " & $iPaused & @CRLF)
EndFunc   ;==>PausePlay
Прекрасно работает с любыми одиночными нажатиями, но не работает (у меня) с двойными.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: MouseSetOnEvent - Обработка событии мышки

madmasles [?]
как назначить функцию на двойной клик мыши
Странно, но хук не реагирует на WM_LBUTTONDBLCLK ($MOUSE_PRIMARYDBLCLK_EVENT).
Можно обойти это примерно так (нужно ещё поиграться с параметрами):

Код:
#include "MouseOnEvent.au3"

Global $iPrmUp_Event = 0, $iDblClck_Timer = 0
Global $iDblClck_Delay = 300
Global $iDblClck_Event = 0

HotKeySet("^+e", "_Quit")

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_PrmUpDwn_Event", 1, "", 0, 0)
_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "_PrmUpDwn_Event", 2, "", 0, 0)

While 1
	Sleep(10)
	
	If $iDblClck_Event Then
		$iDblClck_Event = 0
		
		MsgBox(64, 'Title', 'Primary Mouse Button Double Clicked.')
		;Exit
	EndIf
WEnd

Func _PrmUpDwn_Event($iEvent)
	If $iEvent = 1 Then
		If $iPrmUp_Event = 1 And TimerDiff($iDblClck_Timer) > $iDblClck_Delay Then
			$iPrmUp_Event = 0
			$iDblClck_Event = 0
			$iDblClck_Timer = 0
		EndIf
		
		Return
	EndIf
	
	$iPrmUp_Event += 1
	
	If $iDblClck_Timer = 0 Then
		$iDblClck_Timer = TimerInit()
		Return
	EndIf
	
	If TimerDiff($iDblClck_Timer) > $iDblClck_Delay Then
		$iPrmUp_Event = 0
		$iDblClck_Event = 0
		$iDblClck_Timer = 0
		Return
	EndIf
	
	$iPrmUp_Event = 0
	$iDblClck_Event = 1
	$iDblClck_Timer = 0
EndFunc

Func _Quit()
	Exit
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Re: MouseSetOnEvent - Обработка событии мышки

CreatoR [?]
Можно обойти это примерно так
Так, вроде, тоже можно:
Код:
#include <Misc.au3>

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

Global $iCount = 0, _
		$fClick = True, _
		$iDblClick = 0, _
		$iStart = TimerInit()

While 1
	If _DblClick() Then
		_MyFunc()
	EndIf
	Sleep(20)
WEnd

Func _MyFunc()
	$iDblClick += 1
	MsgBox(64, $iDblClick, '2 click', 2)
EndFunc   ;==>_MyFunc

Func _DblClick($iWait = 250, $sKey = '01')
	If _IsPressed($sKey) Then
		If $fClick Then
			$iStart = TimerInit()
			$iCount += 1
			$fClick = False
		EndIf
	Else
		$fClick = True
	EndIf
	If TimerDiff($iStart) >= $iWait Then
		$iCount = 0
		Return False
	EndIf
	If $iCount = 2 Then Return True
EndFunc   ;==>_DblClick

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Re: MouseSetOnEvent - Обработка событии мышки

CreatoR
:-[
Я не прав. Оно никак не связано с «MouseSetOnEvent».
 

stellar

Новичок
Сообщения
1
Репутация
0
Re: MouseSetOnEvent - Обработка событии мышки

А же как различать боковые кнопки?
Например, _IsPressed есть 'X1 mouse button' и 'X2 mouse button'.
Хочется вместо back-forward повесить на них copy-paste.
 

Dimmak

Знающий
Сообщения
185
Репутация
9
Re: MouseSetOnEvent - Обработка событии мышки

CreatoR
С нетерпением ждем очередное обновление, в котором распознаются обе x-mouse buttons!
:IL_AutoIt_1:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление!

v1.9 [22.07.2012]
* Данная версия не совместима с предыдущими!
* AutoIt 3.3.0.0 больше не поддерживается.
* Вместо параметров $sParam1 и $sParam2, теперь используется $vParam в качестве последнего опционального параметра.
* Функции события ($sFuncName), теперь в качестве первого параметра передаётся $iEvent, и $vParam в качестве второго (оба параметра опциональны).
* Теперь $iBlockDefProc по умолчанию установлен на -1 (функция события может определять, блокировать процесс события или нет, используя возврат из функции значения 1 или 0).
* Исправлены нерабочие события $MOUSE_PRIMARYDBLCLK_EVENT и $MOUSE_SECONDARYDBLCLK_EVENT,
теперь они обрабатываются вручную, т.к окна не всегда получают эти события (зависит от стиля CS_DBLCLKS).
(особо не тестировалось, т.ч на данный момент эти события носят ярлык "экспериментальный").
* Исправлена проблема с ошибкой "Subscript used with non-Array variable", вызвано в случае если не найдено окно с дескриптором параметра $hTargetWnd (окно закрыто).
* Обновлены примеры.
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
А возможно распознавание жестов мыши?

есть функция:
Код:
Func _Hid()
    If Not WinActive($hChild_GUI) Then
        GUISetState(@SW_HIDE, $hGui)
        GUISetState(@SW_SHOW, $hChild_GUI)
		$hMenu = _GUICtrlMenu_GetSystemMenu($hChild_GUI)
		_GUICtrlMenu_DeleteMenu($hMenu, $SC_MOVE, False)
    Else
        GUISetState(@SW_SHOW, $hGui)
        GUISetState(@SW_HIDE, $hChild_GUI)
    EndIf
EndFunc

Горячая клавиша привязана к ней
попробовал добавить так:
Код:
;;;;;;;;;;;;;;;;;;;;;;;;;

_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_Hid")
_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_Hid")

;;;;;;;;;;;;;;;;;;;;;;;;


Но почему то разница в реакции огромная. По горячей клавише быстрее гораздо.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
ivsatel [?]
почему то разница в реакции огромная
Насколько огромная, несколько секунд?

И тем более это неправильное использование, в заголовке UDF указано, что блокировать функцию события не рекомендуется.
Нужно бы это добавить в первое сообщение...
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Да, секунды 3-4 перерисовывается GUI.
Исключил её использование в такой форме, а жаль, очень хорошее применение получилось бы.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
ivsatel [?]
распознавание жестов мыши
Вот так примерно (очень грубый набросок):

Код:
#include "MouseOnEvent.au3"
#include "IsPressedEx.au3"

Global $a__MSG_LastMPos = -1
Global $s__MSG_Buffer = ''

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

Sleep(10000)

Func _MouseSetGesture($sModifiers, $sGestures, $sFuncName)
	Local $aParam[3] = [$sModifiers, $sGestures, $sFuncName]
	$a__MSG_LastMPos = MouseGetPos()
	_MouseSetOnEvent($MOUSE_MOVE_EVENT, "__MouseSetGesture_Handler", 0, 0, $aParam)
EndFunc

Func __MouseSetGesture_Handler($iEvent, $aParam)
	Local $aMPos = MouseGetPos()
	Local $sModifiers, $sGestures, $sFuncName
	Local $iGesture_Left, $iGesture_Right, $iGesture_Up, $iGesture_Down
	Local $iMoved_Left, $iMoved_Right, $iMoved_Up, $iMoved_Down
	
	$sModifiers = $aParam[0]
	$sGestures = $aParam[1]
	$sFuncName = $aParam[2]
	
	If $sModifiers <> '' And Not _IsPressedEx($sModifiers) Then
		Return 0
	EndIf
	
	$aSplit_Gesture = StringSplit($sGestures, ',')
	
	$iGesture_Left = (StringInStr($sGestures, 'Left') > 0)
	$iGesture_Right = (StringInStr($sGestures, 'Right') > 0)
	$iGesture_Up = (StringInStr($sGestures, 'Up') > 0)
	$iGesture_Down = (StringInStr($sGestures, 'Down') > 0)
	
	$iMoved_Left = ($aMPos[0] < $a__MSG_LastMPos[0])
	$iMoved_Right = ($aMPos[0] > $a__MSG_LastMPos[0])
	$iMoved_Up = ($aMPos[1] < $a__MSG_LastMPos[1])
	$iMoved_Down = ($aMPos[1] > $a__MSG_LastMPos[1])
	
	$a__MSG_LastMPos = $aMPos
	
	If $iMoved_Left And $iGesture_Left Then
		$s__MSG_Buffer &= 'Left,'
	EndIf
	
	If $iMoved_Right And $iGesture_Right Then
		$s__MSG_Buffer &= 'Right,'
	EndIf
	
	If $iMoved_Up And $iGesture_Up Then
		$s__MSG_Buffer &= 'Up,'
	EndIf
	
	If $iMoved_Down And $iGesture_Down Then
		$s__MSG_Buffer &= 'Down,'
	EndIf
	
	$s__MSG_Buffer = StringRegExpReplace($s__MSG_Buffer, ',+$', '')
	
	For $i = 1 To $aSplit_Gesture[0]
		If Not StringInStr($s__MSG_Buffer, $aSplit_Gesture[$i]) Then
			Return
		EndIf
	Next
	
	$s__MSG_Buffer = ''
	Call($sFuncName)
EndFunc

Func _Gesture_RightUp_Proc()
	ToolTip('<Ctrl + Right-Up> Gesture recieved!')
EndFunc


требуется IsPressedEx UDF.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
ivsatel [?]
Исключил её использование в такой форме, а жаль
Создай глобальную переменную (например $bMouseEvent = False), задавай ей значение True при вызове события, и проверяй в главном цикле, если True то вызывай свою функцию (_Hid).
Вобщем см. как это сделано в примере «DoubleClick Monitor.au3».
 

G8888

Новичок
Сообщения
1
Репутация
0
Дайте пожалуйста нормальный MouseOnEvent.zip, чтоб там было все, да и не забудте написать версию Автоита.А то скачивал(MouseOnEvent.zip), но почему то не работает в версии 3.3.6.1
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
G8888 [?]
почему то не работает в версии 3.3.6.1
Примеры из архива работают, что именно не работает?

Впрочем, отвечать не нужно, аккаунт блокирован, за нарушение правил форума.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
А распознования 4 и 5 кнопок мыши отдельно так и нет?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Кстати, сейчас только заметил - в 1 посте ошибка в описании констант событии - "Прокручивание коллёсика" )
 

RavdonikaS

Новичок
Сообщения
68
Репутация
4
Кстати никто не замечал что указатель мыши если его перемещать начинает работать оч мелкими но заметными на глаз рывками
Замечал это при подключении этой MouseOnEvent.au3 и такая же ситуация с MouseTrapEvent.au3 С чем это может быть связано?

Win7 x64 Максимальная
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
RavdonikaS сказал(а):
оч мелкими но заметными на глаз рывками
Это из-за установки низкоуровнего хука, из-за чего скрипт срабатывает между движением мыши, и отправкой этого оповещения системе, т.к. в скрипте всякие "тяжелые" условия(if...select) и AutoIt сам по себе медленный то по этому и получается задержка между оповещениями.
 
Верх