Что нового

[Мышь, клавиатура] Выполнение функции, если пользователь кликнул мышкой в определенную область окна

KarSar

Новичок
Сообщения
15
Репутация
0
Мужики, нужна помощь! Нужно выполнить функцию, если был клик мышкой в прямоугольнике, т.е. не кнопка и не что то другое, просто координаты области в окне.
Необходимо в цикле:
Проверяет, что активное окно соответствует например Notepad
А если именно в этом определенном окне (например в Notepad.exe) кликнуть мышкой по прямоугольным координатам (типа X1 = 100, Y1 = 20, X2 = 120, Y2 = 40), то будет вызвана функция, а если другое окно или клик по координатам не входящим в указанные то sleep(100)

Я правда, долго искал, но так и не могу докрутить )
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: [Мышь, клавиатура] Выполнение функции, если пользователь кликнул мышкой в определенную область

KarSar

Код:
#include <Misc.au3>
HotKeySet('{ESC}', '_Quit')

Opt('MouseCoordMode', 2) ; координаты относительно области активного окна
$X1 = 0
$Y1 = 0
$X2 = 100
$Y2 = 100

Run(@WindowsDir & '\Notepad.exe')
$hNotepad_Wnd = WinWait('[REGEXPCLASS:Notepad.*]')


Local $hDLL = DllOpen('user32.dll')

While 1
	If _IsPressed('01', $hDLL) Then
		$iX = MouseGetPos(0)
		$iY = MouseGetPos(1)
		If _WinGetHoveredHandle() = $hNotepad_Wnd And $iX >= $X1 And $iX <= $X2 And $iY >= $Y1 And $iY <= $Y2 Then
			MsgBox(4096, '_IsPressed', 'Привет!')
		EndIf
	EndIf
	Sleep(30)
WEnd

Func _WinGetHoveredHandle()
	Local $iOld_Opt_MCM = Opt('MouseCoordMode', 1)
	Local $aRet = DllCall('user32.dll', 'int', 'WindowFromPoint', 'long', MouseGetPos(0), 'long', MouseGetPos(1))
	Opt('MouseCoordMode', $iOld_Opt_MCM)
	$aRet = DllCall('User32.dll', 'hwnd', 'GetAncestor', 'hwnd', $aRet[0], 'uint', 2)
	Return HWnd($aRet[0])
EndFunc   ;==>_WinGetHoveredHandle

Func _Quit()
	DllClose($hDLL)
	Exit
EndFunc   ;==>_Quit
 
Автор
K

KarSar

Новичок
Сообщения
15
Репутация
0
[Мышь, клавиатура] Re: [Мышь, клавиатура] Выполнение функции, если пользователь кликнул мышкой в о

:ok: Спасибо огромное, WSWR ! Очень удивлен оперативностью! Все работает!


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

Если блокнот закрыть, и открыть новый с тем же дескриптором окна, то скрипт не отрабатывает. Как можно допилить? Может If WinActive("Notepad","") ?


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




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

Вроде разобрался. Может кому будет нужно


Вот что поменял и добавил:
Код:
$okno = "Новый текстовый документ"

Func _WinGetHoveredHandle()
    $SC = WinGetTitle("[active]")
EndFunc   ;==>_WinGetHoveredHandle


If _WinGetHoveredHandle() = $okno And $iX


Код:
#include <Misc.au3>

Opt("TrayIconDebug",1) ; отлов ошибок. смотреть в трее
Opt("WinTitleMatchMode", 2)     ;1=с началом, 2=частично, 3=точно, 4=расширено, -1 to -4=Nocase
;~ Opt("MouseCoordMode", 0)
Opt("PixelCoordMode", 0)



HotKeySet('{ESC}', '_Quit')

Opt('MouseCoordMode', 2) ; координаты относительно области активного окна
$X1 = 47
$Y1 = 4
$X2 = 150
$Y2 = 19

;~ Run(@WindowsDir & '\Notepad.exe')
$hNotepad_Wnd = WinWait("Новый текстовый документ","")
$okno = "Новый текстовый документ"

Local $hDLL = DllOpen('user32.dll')

While 1
    If _IsPressed('01', $hDLL) Then
        $iX = MouseGetPos(0)
        $iY = MouseGetPos(1)
        If _WinGetHoveredHandle() = $okno And $iX >= $X1 And $iX <= $X2 And $iY >= $Y1 And $iY <= $Y2 Then
            MsgBox(4096, '_IsPressed', 'Привет!')
        EndIf
    EndIf
    Sleep(30)
WEnd

Func _WinGetHoveredHandle()
    $SC = WinGetTitle("[active]")
EndFunc   ;==>_WinGetHoveredHandle

Func _Quit()
    DllClose($hDLL)
    Exit
EndFunc   ;==>_Quit
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Мышь, клавиатура] Выполнение функции, если пользователь кликнул мышкой в определенную область

KarSar [?]
Вот что поменял и добавил:
Под спойлером тег AutoIt кода тоже надо применять, так что:
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх