Что нового

[Автоматизация] _MouseSetOnEvent Как выключить функцию?

pgs2

Новичок
Сообщения
29
Репутация
0
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#Include <date.au3>
#include <GuiEdit.au3>
#include <MouseSetOnEvent_UDF.au3>
#include <WinAPIEx.au3>

Opt("GUIOnEventMode", 1)

$Form1 = GUICreate("Test", 208, 278, 419, 182)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$Edit1 = GUICtrlCreateEdit("", 16, 8, 177, 233, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
GUICtrlSendMsg($Edit1, $EM_LIMITTEXT, -1, 0)
$Start = GUICtrlCreateButton("Start",20,250)
GUICtrlSetOnEvent($Start, "Start")
$Close = GUICtrlCreateButton("Close",60,250)
GUICtrlSetOnEvent($Close, "CLOSEClicked")
GUISetState(@SW_SHOW)

While   1
	
Sleep(100)
WEnd

Func Start()
	Sleep(100)
	_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_WinGetInfo")
EndFunc

Func CLOSEClicked()
    Exit
EndFunc

Func _WinGetInfo()
	Local $hwnd
	Sleep(100)
	$titl = WinGetTitle( "[ACTIVE]" )
    $hWnd = WinGetHandle($titl)
	$Wklass = _WinAPI_GetClassName($hWnd)
	GUICtrlSetData($Edit1, $titl &@CRLF&@CRLF,1)
	GUICtrlSetData($Edit1, $Wklass &@CRLF,1)
EndFunc

Я предпологал, что это только задержка в ожидании клика, но как только скрипт доходит до _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_WinGetInfo"), все дальнейшие клики приводят к запуску _WinGetInfo(). Как сделать так чтоб функция отработала и больше не реагировала на клики, до следущего вызова?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pgs2 [?]
все дальнейшие клики приводят к запуску _WinGetInfo()
Так и было задуманно, как и следует с названия функций, она задаёт события для клика мышкой.

Как сделать так чтоб функция отработала и больше не реагировала на клики, до следущего вызова?
Т.е нужно отловить только первый клик? тогда в функций события нужно указать отмену регистраций события:

Код:
Func _WinGetInfo()
	_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
          ....
EndFunc
 
Автор
P

pgs2

Новичок
Сообщения
29
Репутация
0
Сделал так
Код:
Func _WinGetInfo()
    _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
          ....
EndFunc

выкидывает ошибку:
C:\Program Files\AutoIt3\Include\MouseSetOnEvent_UDF.au3 (224) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If $__MouseSetOnEvent_aEvents[$i][5] = -1 Then Return $iRet
If ^ ERROR
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pgs2 [?]
выкидывает ошибку
Полный пример в студию... хотя так делать не рекомендуется, это я забыл, лучше так:

Код:
Global $iMouseUnSet = 0

....

While 1
    If $iMouseUnSet Then
          $iMouseUnSet = 0
          _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
    EndIf
    
    ....
WEnd

Func _WinGetInfo()
    $iMouseUnSet = 1
          ....
EndFunc
 
Автор
P

pgs2

Новичок
Сообщения
29
Репутация
0
Бррр. :wacko:
Код:
Global $iMouseUnSet = 0

....

While 1
    If $iMouseUnSet Then
          $iMouseUnSet = 0
          _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
    EndIf
    
    ....
WEnd

Func _WinGetInfo()
    $iMouseUnSet = 1
          ....
EndFunc

так не работает совсем(
и даже так
Код:
While 1
    If $iMouseUnSet Then
          $iMouseUnSet = 0
          _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT,"_WinGetInfo")
    EndIf
    
    ....
WEnd

Или же мне можно не париться и получить
Код:
$ClassnameNN = ControlGetFocus($hWnd)
другим способом без клика на контроле? К примеру навести курсор на кнопку и нажать горячую клавишу? Но я пока не нашел такого(((
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pgs2 [?]
так не работает совсем
Полный пример где не работает можно? :-X

Или же мне можно не париться и получить
Что именно нужно получить? класс элемента под курсором?

Код:
#include <WinAPI.au3>

MsgBox(64, 'Hovered ClassName', _WinAPI_GetClassNameHovered())

Func _WinAPI_GetClassNameHovered()
	Local $aMousePos, $stPoint, $hWnd, $sClassName
	
	$aMousePos = MouseGetPos()
	$stPoint = DllStructCreate("int;int")
	DllStructSetData($stPoint, 1, $aMousePos[0])
	DllStructSetData($stPoint, 2, $aMousePos[1])

	$hWnd = _WinAPI_WindowFromPoint($stPoint)
	$sClassName = _WinAPI_GetClassName($hWnd)
	
	Return $sClassName
EndFunc



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

pgs2 [?]
Почему "даже", так не должно работать, это наоборот - задаст событие для клика :smile:
 
Автор
P

pgs2

Новичок
Сообщения
29
Репутация
0
Пример где не работает:
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#Include <date.au3>
#include <GuiEdit.au3>
#include <MouseSetOnEvent_UDF.au3>
#include <WinAPIEx.au3>

Opt("PixelCoordMode",2)
Opt("WinTitleMatchMode",1)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",2)
Opt("GUIOnEventMode", 1)

Global $iMouseUnSet = 0
$Form1 = GUICreate("Координатор", 208, 278, 419, 182)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$Edit1 = GUICtrlCreateEdit("", 16, 8, 177, 233, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
GUICtrlSendMsg($Edit1, $EM_LIMITTEXT, -1, 0)
$Start = GUICtrlCreateButton("Start",20,250)
GUICtrlSetOnEvent($Start, "Start")
$Close = GUICtrlCreateButton("Close",60,250)
GUICtrlSetOnEvent($Close, "CLOSEClicked")
GUISetState(@SW_SHOW)
;While   1
;HotKeySet("{SPACE}", "_WinGetInfo")
;Sleep(100)
;WEnd
While 1
    If $iMouseUnSet Then ; <== либо так
          $iMouseUnSet = 0
          _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT,"_WinGetInfo")

	EndIf


WEnd

Func _WinGetInfo()
	Local $hwnd
	Sleep(100)
	;_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
	$iMouseUnSet = 1
	$titl = WinGetTitle( "[ACTIVE]" )
    $hWnd = WinGetHandle($titl)
	$Wklass = _WinAPI_GetClassName($hWnd)
	$ClassnameNN = ControlGetFocus($hWnd)
	GUICtrlSetData($Edit1, $titl &@CRLF,1)
	GUICtrlSetData($Edit1, $ClassnameNN &@CRLF,1)
	
EndFunc


Func Start()
	Sleep(3000)
	While 1
		If $iMouseUnSet Then   ; <== Либо так
			$iMouseUnSet = 0
			_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT,"_WinGetInfo")
		ExitLoop
		EndIf
	WEnd
EndFunc

Func CLOSEClicked()

    Exit

EndFunc

Ремарками перекрываю либо вызов из под функции старт, либо из основного цикла.


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

Не не то, _WinAPI_GetClassNameHovered() выдает класс окна, а мне надо класс элемента, как выдает Autoit Window Info в разделе >>>> Control <<<<. Там как раз ClassnameNN: есть и вообще шоколадно будет получить ControlClick Coords: Это нужно например, для полуавтоматической настройки кликера на элементы управления GUI.
 
Верх