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