Что нового

Проверка на клик мыши в заданных координатах

Tapok

Новичок
Сообщения
204
Репутация
0
Как проверить, что пользователь кликнул мышью в заданном диапазоне координат (прямоугольник) и если да- вывести сообщение
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#Include "UI.au3"

OnAutoItExitRegister('__OnExit')
__FEng_UI_Startup()

_FEng_UI_TrigAdd(0, 0, 200, 200, '__CallBack', True, 'Example message...')
_FEng_UI_AllowInput()

While Sleep(10)
	WEnd

; =================
Func __CallBack($iTrig, $iMsg, ByRef $tMSLLHOOK, ByRef $vExtra)
	If $iMsg = 0x0201 Then ;WM_LBUTTONDOWN
		ConsoleWrite( $vExtra & @CRLF)
	EndIf
EndFunc

Func __OnExit()
	__FEng_UI_Shutdown()
EndFunc


UI.au3
Код:
#cs ----------------------------------------------------------------------------

 File Ver .....: 03.04.15
 Engine Ver ...: 2.0.0
 AutoIt Ver ...: 3.3.12.0
 Author .......: Firex

#ce ----------------------------------------------------------------------------

; FEngin: UI []

Global _ ;[0]: [0] - Count, [1] -
	$__FE_UI_aTrig[99][7] = [[0]], _
	$__FE_UI_CbMouse, _
	$__FE_UI_hMouseHook, _
	$__FE_UI_InputCount

Global Const $tagMSLLHOOK = 'long X; long Y; dword mouseData; dword flags; dword time; ulong_ptr dwExtraInfo'
; ##############################################################

#Include "WinAPI.au3"


; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigAdd
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigAdd($x, $y, $w, $h, $CallBack, $fState = 0, $vExtra = 0)
	Local $Id, $Num = $__FE_UI_aTrig[0][0]
	; ---
	If $Num Then
		For $Id = $Num To 1 Step -1
			If $__FE_UI_aTrig[$Id][0] == '' Then _
				ExitLoop
		Next
	EndIf
	If Not $Id Then
		$Id = $Num + 1
		If $Id > ( UBound( $__FE_UI_aTrig ) - 1 ) Then _
			Return 0

		$__FE_UI_aTrig[0][0] = $Id
	EndIf

	$__FE_UI_aTrig[$Id][0] = Int( $fState )
	_FEng_UI_TrigPosSet($Id, $x, $y, $w, $h)

	$__FE_UI_aTrig[$Id][5] = $CallBack
	$__FE_UI_aTrig[$Id][6] = $vExtra
	; ---
	Return $Id
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigEnable
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigEnable($Id, $fEnable = 1)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][0] = Int( $fEnable )
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigPosSet
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigPosSet($Id, $x, $y, $w , $h)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][1] = $x
		$__FE_UI_aTrig[$Id][2] = $y
		$__FE_UI_aTrig[$Id][3] = $x + $w
		$__FE_UI_aTrig[$Id][4] = $y + $h
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigDelete
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigDelete($Id)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][0] = ''
		$__FE_UI_aTrig[$Id][6] = 0
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_AllowInput
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_AllowInput($fState = 1)
	$__FE_UI_InputCount += ( $fState ) ? 1 : -1
	If $__FE_UI_InputCount = 1 Then
		Local $hModule
		; ---
		$hModule = _WinAPI_GetModuleHandle(0)
		$__FE_UI_hMouseHook = _WinAPI_SetWindowsHookEx( _
			$WH_MOUSE_LL, _
			DllCallbackGetPtr( $__FE_UI_CbMouse ), _
			$hModule _
		)
		Return ( $__FE_UI_hMouseHook <> 0 )
	ElseIf $__FE_UI_InputCount < 1 Then
		_WinAPI_UnhookWindowsHookEx( $__FE_UI_hMouseHook )
		$__FE_UI_hMouseHook = 0
	EndIf
EndFunc



; ==============================================================
; ### Internals
; ==============================================================
Func __FEng_UI_Startup()
	$__FE_UI_CbMouse = DllCallbackRegister("__UI_MouseHandler", "int", "int;ptr;ptr")
EndFunc

Func __FEng_UI_Shutdown()
	$__FE_UI_InputCount = 0
	If $__FE_UI_hMouseHook Then _
		_FEng_UI_AllowInput(0)

	DllCallbackFree( $__FE_UI_CbMouse )
EndFunc

Func __UI_MouseHandler($iCode, $wParam, $lParam)
	Local $Ret = _WinAPI_CallNextHookEx( $__FE_UI_hMouseHook, $iCode, $wParam, $lParam )
	; -
	If $iCode = 0 Then ;HC_ACTION
		Local $tMSLLHOOK = DllStructCreate( $tagMSLLHOOK, $lParam ) ;Not completed...
		; ---
		For $Id = 1 To $__FE_UI_aTrig[0][0] Step 1
			If $__FE_UI_aTrig[$Id][0] And _
				$tMSLLHOOK.X >= $__FE_UI_aTrig[$Id][1] And $tMSLLHOOK.X <= $__FE_UI_aTrig[$Id][3] And _
				$tMSLLHOOK.Y >= $__FE_UI_aTrig[$Id][2] And $tMSLLHOOK.Y <= $__FE_UI_aTrig[$Id][4] _
			Then
				If $__FE_UI_aTrig[$Id][5] Then _
					Return Call( $__FE_UI_aTrig[$Id][5], _
						$Id, _
						$wParam, _
						$tMSLLHOOK, _
						$__FE_UI_aTrig[$Id][6] _ ;Extra info
					)
				; *
				ExitLoop
			EndIf
		Next
	EndIf
	; ---
	Return $Ret
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
firex,
А не проще проверять вхождение точки функцией _WinAPI_PtInRect()?
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
В
Код:
__FEng_UI_TriggAdd(0,0,200,200)

Числа - это координаты левого верхнего и правого нижнего углов? Если да, то функция работает и для не входящих точек


Добавлено:
Сообщение автоматически объединено:

madmasles, а какая функция проверяет, кликнул ли пользователь мышью (даже не привязываясь к координатам)?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
madmasles
Минимизировал активное использование DllCall. С другими случаями согласен - должно быть проще :smile:

Tapok [?]
Числа - это координаты левого верхнего и правого нижнего углов? Если да, то функция работает и для не входящих точек
X, Y, Width, Height. Иными словами прямоугольник(квадрат) 200x200 на позиции 0, 0.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
firex, работает, спасибо! :smile:
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
alex33, спасибо! Очень хорошая библиотека, как раз такой не хватало! :smile:
 
Верх