Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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 у меня не получилось, а вносить свои правки тут неуместно... Зато на моём примере видно, как вся эта кухня работает.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:29, 09-08-2009 | #8