Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Отследить нажатие кнопки (http://forum.oszone.net/showthread.php?t=147269)

w3d1 06-08-2009 12:37 1187048

Отследить нажатие кнопки
 
Как можно в скрипте отследить нажатие определенной кнопки в программе, запущенной из этого скрипта?

FlatX007 06-08-2009 13:11 1187083

Сам понял что написал ?

w3d1 06-08-2009 13:20 1187092

Из скрипта запускается некая программа.
Далее нужно чтобы скрипт отловил нажатие определенной кнопки в программе человеком.
Что не так?

SyDr 06-08-2009 14:47 1187177

Нажатие определённой кнопки интерфейса или кнопки клавиатуры?

w3d1 06-08-2009 14:49 1187180

Кнопки (Button) интерфейса

FlatX007 06-08-2009 21:36 1187553

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

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

w3d1 07-08-2009 06:53 1187808

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

amel27 09-08-2009 05:29 1189189

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, но кое в чем она меня не устраивает: Во-первых, нет возможности условной блокировки события в самой процедуре обработки... хотя ИМХО это вполне можно сделать на основе возвращаемого функцией значения... Во-вторых, его _IsHoveredWnd() не подходит для контролов, (виноват WinActive)... Короче, реализовать мою задумку на этой UDF у меня не получилось, а вносить свои правки тут неуместно... Зато на моём примере видно, как вся эта кухня работает. ;)

SyDr 09-08-2009 10:18 1189235

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

amel27 09-08-2009 10:30 1189242

SyDr, правда странно... только это не скрипт, а ControlClick() так работает для "Пуска", интересно почему?
Код:

ControlClick("[CLASS:Shell_TrayWnd]", "", "Button1")

Creat0R 09-08-2009 15:01 1189370

Цитата:

Цитата amel27
У Creat0R'а есть интересная UDF как раз для такого случая - MouseSetOnEvent_UDF »

Как раз таки для такого случая есть не менее интересная WinControlSetEvent UDF, которая думаю больше подойдёт для поставленной задачи ;)

Цитата:

Цитата amel27
_IsHoveredWnd() не подходит для контролов, (виноват WinActive) »

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

w3d1 03-09-2009 14:24 1210436

В общем, переделал логику работы, вопрос закрыт.


Время: 22:53.

Время: 22:53.
© OSzone.net 2001-