Что нового

[Элементы GUI] Выполнение функции после нажатия кнопки

Arbios

Новичок
Сообщения
18
Репутация
0
Долго изучал поиск, и с уверенностью могу сказать что такого вопроса не было, во всяком случае с подобным объяснением)

Возьмем к примеру calc.exe, кнопочка 1 идет с идентификатором [CLASS:Button; INSTANCE:7].
Как сделать так, чтобы определенная функция запустилась только после того как была нажата кнопочка 1. Пытался сделать так но ничего не выходит, возможно это совершенно не то, что там нужно использовать :(
Код:
#include <GuiConstants.au3>
Opt("GUIOnEventMode", 1)

WinWaitActive("Калькулятор Плюс","MC")
GUICtrlSetOnEvent ( "[CLASS:Button; INSTANCE:7]", "ShowMessage" )

Func ShowMessage()
	MsgBox(0, "Поздравляю", "Вы нажали кнопку 1")
EndFunc
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
Arbios
Изучайте следующую функцию:
Код:
_WinAPI_SetWindowsHookEx ; WH_MOUSE_LL


В Callback-обработчике которой анализируйте координаты клика, к примеру так:
Код:
_WinAPI_WindowFromPoint


Таким образом выйдете на hWnd окна/элемента, который получил клик.
 
Автор
Arbios

Arbios

Новичок
Сообщения
18
Репутация
0
Если я правильно понял, для разных разрешений экрана эта функция
Код:
_WinAPI_WindowFromPoint
не подойдёт?
 
A

Alofa

Гость
Код:
#include <Misc.au3>
#include <WinAPI.au3>

Global $hDLL = DllOpen("user32.dll"), $Struct = DllStructCreate($tagPoint)
HotKeySet("{ESC}", "_Quit") ; Закончить работу скрипта

If ProcessExists('Calc.exe') Then
	$hWnd = WinActivate('Калькулятор')
Else
	Run('Calc.exe') ; Запускаем калькулятор
	$hWnd = WinWait('Калькулятор') ; ждем его окно
EndIf

While 1 ; Бесконечный цикл ожидания нажатия левой кнопки мыши
	If _IsPressed('01', $hDLL) Then
		If WinGetHandle('[ACTIVE]') = $hWnd Then
			$xy = MouseGetPos()
			DllStructSetData($Struct, "x", $xy[0])
			DllStructSetData($Struct, "y", $xy[1])
			ToolTip('Дескриптор:  ' & _WinAPI_WindowFromPoint($Struct), Default, Default, '', 0, 1)
		Else
			ToolTip('')
		EndIf
	EndIf
	Sleep(100)
WEnd

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



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

А применительно к этому:
Arbios сказал(а):
... Как сделать так, чтобы определенная функция запустилась только после того как была нажата кнопочка 1
Вот:
Код:
#include <Misc.au3>
#include <WinAPI.au3>

Global $hControl, $hDLL = DllOpen("user32.dll"), $Struct = DllStructCreate($tagPoint)
HotKeySet("{ESC}", "_Quit") ; Закончить работу скрипта

If ProcessExists('Calc.exe') Then
    $hWnd = WinActivate('Калькулятор')
Else
    Run('Calc.exe')
    $hWnd = WinWait('Калькулятор')
EndIf
$hControl = ControlGetHandle($hWnd, '', '[CLASS:Button; INSTANCE:5]') ; У меня это кнопка "1"

While 1
    If _IsPressed('01', $hDLL) Then
        If WinGetHandle('[ACTIVE]') = $hWnd Then
            $xy = MouseGetPos()
            DllStructSetData($Struct, "x", $xy[0])
            DllStructSetData($Struct, "y", $xy[1])
            If _WinAPI_WindowFromPoint($Struct) = $hControl Then MsgBox(4096 + 64, '', 'Нажата кнопка 1')
        EndIf
    EndIf
    Sleep(100)
WEnd

Func _Quit()
    DllClose($hDLL)
    Exit
EndFunc   ;==>_Quit
 
Верх