r35p3ct, Я вот думаю, если с BlockInput и _BlockInputEx сопряжено столько проблем, то не легче ли будет использовать для мышки глобальный перехват... (как вариант конечно)
Код:
#include <WinApi.au3>
#include <WindowsConstants.au3>
Global Const $MOUSE_MOVE_EVENT = 512
Global $p_MouseProc, $hMod, $hHook, $fMouseMoveBlocked
$p_MouseProc = DllCallbackRegister("HookProc","int","int;ptr;ptr")
$hMod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($p_MouseProc), $hMod, 0)
HotKeySet("{Esc}", "Quit")
HotKeySet("!0", "Click")
While 1
Sleep(2000)
WEnd
Func Click()
_MouseClick(685, 122)
EndFunc
;~ Процедура перехвата
Func HookProc($nCode, $wParam, $lParam)
Local $ret
If $nCode < 0 Then
$ret = _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Return $ret
EndIf
; Блокируем движение мышки если требуется:
If $wParam = $MOUSE_MOVE_EVENT And $fMouseMoveBlocked Then Return 1
$ret = _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Return $ret
EndFunc
Func Quit()
Exit
EndFunc
Func OnAutoItExit()
DllCallbackFree($p_MouseProc)
_WinAPI_UnhookWindowsHookEx($hHook)
EndFunc
;~ При 100% занятости процессора у меня возникали проблемы с точностью работы MouseClick.
;~ Думаю, что не будет лишним, использовать MouseMove и перед кликом проверять координаты курсора и затем блокировать движение.
;~ Использование MouseMove так-же оправдывается тем, что движение мышки после блокировки будет уже невозможным
Func _MouseClick($iX, $iY)
Local $aMouse, $i
Do
$i += 1 ; счетчик попыток
If $i > 5 Then Return SetError(1)
MouseMove($iX, $iY, 1)
$aMouse = MouseGetPos()
If @error Then Return SetError(2)
Until $aMouse[0] = $iX And $aMouse[1] = $iY
$fMouseMoveBlocked = True ; Блокировка
Sleep(10) ; Время нахождения курсора над элементом перед щелчком.
MouseClick("left", $iX, $iY, 1, 1)
$fMouseMoveBlocked = False ; Разблокировка
EndFunc
|