Войти

Показать полную графическую версию : [решено] Отследить нажатие кнопки


w3d1
06-08-2009, 12:37
Как можно в скрипте отследить нажатие определенной кнопки в программе, запущенной из этого скрипта?

FlatX007
06-08-2009, 13:11
Сам понял что написал ?

w3d1
06-08-2009, 13:20
Из скрипта запускается некая программа.
Далее нужно чтобы скрипт отловил нажатие определенной кнопки в программе человеком.
Что не так?

SyDr
06-08-2009, 14:47
Нажатие определённой кнопки интерфейса или кнопки клавиатуры?

w3d1
06-08-2009, 14:49
Кнопки (Button) интерфейса

FlatX007
06-08-2009, 21:36
Вернуть положение окна в котором находится кнопка, зная в каком месте находится кнопка в окне вычисляем её координаты.
Возвращаем координаты курсора по отношению к четырём координатам кнопки, если они совпадают то чени-то делаем.

Незнаю кароче вот только это на ум пришло ...хотя мож какая функция есть невникал.

w3d1
07-08-2009, 06:53
Блин. ControlID этой кнопки-то определяется, нажать из скрипта я на нее могу,но в том-то и дело, что по логике именно человек на нее должен нажать и скрипт дальше поедет.
Неужели нет решения?

amel27
09-08-2009, 05:29
w3d1, само собой, можно - пример для кнопки "Пуск":
Global Const $WH_MOUSE_LL = 14
Global Const $MOUSE_PRIMARYDOWN_EVENT = 513
Global Const $MOUSE_PRIMARYUP_EVENT = 514
; Наш подопытный контрол (кнопка "Пуск")
Global $sMyWinTitle = "[CLASS:Shell_TrayWnd]"
Global $sMyWinText = ""
Global $sMyControl = "Button1"
; Рабочие глобальные переменные
Global $iMyToggle = False
Global $hMyControl = ControlGetHandle($sMyWinTitle, $sMyWinText, $sMyControl)
; Регистрируем ф-цию перехвата сообщений мышки
Global $hKeyProc = DllCallbackRegister ("_KeyProc", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", $WH_MOUSE_LL, _
"ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)

MsgBox(64, "Сообщение", 'На 20 секунд кнопка "Пуск" будет завачена под полный контроль!"')
Sleep (20000)

; Процедура перехвата/обработки событий мышки
Func _KeyProc($nCode, $wParam, $lParam)
Local $aRet, $iRet
Select
Case $wParam = $MOUSE_PRIMARYDOWN_EVENT And _ControlIsHovered($hMyControl) ; нажали левую кнопку
$iMyToggle = True ; запомнили где нажали
Return 1 ; блокируем событие
Case $wParam = $MOUSE_PRIMARYUP_EVENT And _ControlIsHovered($hMyControl) ; отпустили левую кнопку
If $iMyToggle = True Then ; проверили, где отпустили
$iRet = MsgBox(52, "Перехвачено действие", "Выполнить нажатие на кнопку?")
If $iRet = 6 Then ControlClick($sMyWinTitle, $sMyWinText, $sMyControl)
EndIf
$iMyToggle = False
Return 1 ; блокируем событие
Case Else ; корректно пропускаем все остальные события
$aRet = DllCall("user32.dll","long","CallNextHookEx","hwnd", $hHook[0], _
"int", $nCode, "ptr", $wParam, "ptr", $lParam)
Return $aRet[0]
EndSelect
EndFunc

; Функция, проверяющая HWND контрола под мышкой
Func _ControlIsHovered($hWnd)
Local $aRet = DllCall("User32.dll", "int", "WindowFromPoint", _
"long", MouseGetPos(0), _
"long", MouseGetPos(1))

Return (HWnd($aRet[0])==$hWnd)
EndFunc

P.S. У Creat0R'а есть интересная UDF как раз для такого случая - MouseSetOnEvent_UDF (http://www.autoitscript.com/forum/index.php?showtopic=64738), но кое в чем она меня не устраивает: Во-первых, нет возможности условной блокировки события в самой процедуре обработки... хотя ИМХО это вполне можно сделать на основе возвращаемого функцией значения... Во-вторых, его _IsHoveredWnd() не подходит для контролов, (виноват WinActive)... Короче, реализовать мою задумку на этой UDF у меня не получилось, а вносить свои правки тут неуместно... Зато на моём примере видно, как вся эта кухня работает. ;)

SyDr
09-08-2009, 10:18
Вроде немного неправильно работает...
Без скрипта - нажмите на кнопку, а потом на рабочий стол. Менюшка исчезает.
Со скриптом - остаётся.

amel27
09-08-2009, 10:30
SyDr, правда странно... только это не скрипт, а ControlClick() так работает для "Пуска", интересно почему?
ControlClick("[CLASS:Shell_TrayWnd]", "", "Button1")

Creat0R
09-08-2009, 15:01
У Creat0R'а есть интересная UDF как раз для такого случая - MouseSetOnEvent_UDF »
Как раз таки для такого случая есть не менее интересная WinControlSetEvent UDF (http://www.autoitscript.com/forum/index.php?showtopic=96003), которая думаю больше подойдёт для поставленной задачи ;)

_IsHoveredWnd() не подходит для контролов, (виноват WinActive) »
Ну оно как бы и не задумывалось для контролов, только для окон :).

w3d1
03-09-2009, 14:24
В общем, переделал логику работы, вопрос закрыт.




© OSzone.net 2001-2012