Показать полную графическую версию : [решено] BlockInputEx и MouseClick несколько вопросов
В описании к BlockInputEx написано: "2 - Block only mouse", там же в примере
;Here we block only *Mouse* input (without keyboard).
_BlockInputEx(1) В чем подвох?)
Сначала хотел использовать блокирование мышки для того, чтобы во время выполнения случайно не двинуть мышку, но при заблокированной мышке комманда MouseClick тоже не работает. Можно ли как нибудь послать клик в определенную координату и заблокировать мышку?
Для тех кто не вкурсе, речь про самопальную функцию BlockInputEx (http://autoit-script.ru/index.php/topic,162.0.html).
В чем подвох? »
Ни в чём, это просто ошибка в примере. Поправлено в последней версии.
Сначала хотел использовать блокирование мышки для того, чтобы во время выполнения случайно не двинуть мышку, но при заблокированной мышке комманда MouseClick тоже не работает. Можно ли как нибудь послать клик в определенную координату и заблокировать мышку? »
Тут есть два варианта решения. Первый это отключение блокировки на момент клика, а второй это изначальная блокировка только движения мышки, ну или всего кроме левого клика:
;Here we block *Mouse* input, except the mouse primary click.
_BlockInputEx(2, "{MPDOWN}|{MPUP}")
_BlockInputEx(2, "{MPDOWN}|{MPUP}")
MouseClick("left",685,122,1,0)
sleep(1000)
_BlockInputEx(0)
Клик не происходит...
Про первый вариант не понял, суть такая, сижу за компьютером работаю, скрипт например должен кликать через определенное время куда нибудь, вот нужно как нибудь не допустить перемещения мышки в момент клика...
Клик не происходит »
И не должен. Тут ведь функция пытается подвинуть мышку, а её движение блокируется.
Про первый вариант не понял »
Имелось в виду отключение (_BlockInputEx(0)) блокировки на время клика.
суть такая, сижу за компьютером работаю, скрипт например должен кликать через определенное время куда нибудь, вот нужно как нибудь не допустить перемещения мышки в момент клика... »
Ну, это совсем другая задача, тут _BlockInputEx не поможет, не для этих целей он делался.
Для этого лучше использовать обычный BlockInput:
BlockInput (http://www.autoitscript.com/autoit3/docs/functions/BlockInput.htm)(1)
MouseClick (http://www.autoitscript.com/autoit3/docs/functions/MouseClick.htm)("Main", 685, 122, 1, 0)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(1000)
BlockInput (http://www.autoitscript.com/autoit3/docs/functions/BlockInput.htm)(0)
Creat0R, отлично, работает. Только вот не пойму почему происходит такой глюк, поэтому то и думал, что функция глючная с начала и не юзал. Вобщем после выполнения этого кода в моей проге мышка начинает норм шевелиться, но при нажатии например на клаве цифры 3, выполняется мой HotKeySet("!3", "ip"), даже когда программа выключена, тоесть получается как будто залипла клавиша alt...если выполнять этот код отдельным проектом, то норм. При нажатии ctrl+alt+del все нормализуется.
Как найти из за чего такое может быть? {ALTDOWN} или чего то похожего не использую...да и выполнял этот код как отдельную функцию...
Как найти из за чего такое может быть? »
Сложно сказать не видя скрипта. Но если попробовать, то можно сделать такой трюк:
#include <Misc.au3>
HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)("!3", "ip")
;....
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) ip()
;Ждём пока нажата клавиша Alt
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) _IsPressed(12)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(10)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
;тут содержание функции
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Вот что показало вскрытие:
;HotKeySet("{F9}", "a")
HotKeySet("!0", "a")
While 1
Sleep(100)
WEnd
func a()
BlockInput(1)
sleep(2000)
MouseClick("Main", 685, 122, 1, 0)
Sleep(2000)
BlockInput(0)
EndFunc
По первому хоткею работает нормально, по второму не очень, пришлось ребутать ПК, клавиши ctrl и alt получается зажаты и не функционируют...
Что делать в принципе понятно) Получается BlockInput глючит?
Получается BlockInput глючит? »
Нет. Получается что после вызова функции, модифицирующие клавиши (в нашем случае это Alt) не успевают отжиматься до того как BlockInput вступает в силу. В справке ведь написано:
Remarks
If BlockInput is enabled, the Alt keypress cannot be sent!
видимо оно касается и предварительного нажатия юзером. Поэтому решение из моего последнего поста будет оптимальным.
Если я правильно понял, то решением будет либо не использовать в хоткеях alt, либо
перед каждым вызовом blockinput сделать так?
#include <Misc.au3>
HotKeySet("!3", "ip")
Func ip()
alt()
blockinput(1)
;.... функция
blockinput(0)
endfunc
func alt()
While _IsPressed(12)
Sleep(10)
WEnd
endfunc
решением будет либо не использовать в хоткеях alt, либо
перед каждым вызовом blockinput сделать так? »
Так точно.
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
не легче ли будет использовать для мышки глобальный перехват »
_BlockInputEx использует этот хук. Я только не понимаю смысл блокировки движения мышки перед самим кликом, всё ровно юзер может двигать мышку до клика, и помешать этому :)
всё ровно юзер может двигать мышку до клика, и помешать этому »
Теперь вижу, спасибо. :) Тогда так:
Func _MouseClick($iX, $iY)
Local $aMouse, $i
Do
$i += 1 ; счетчик попыток
MouseMove($iX, $iY, 1)
$fMouseMoveBlocked = True ; Блокируем перемещение
$aMouse = MouseGetPos() ; Определяем координаты
If @error Then
$fMouseMoveBlocked = False
Return
EndIf
If $aMouse[0] = $iX And $aMouse[1] = $iY Then
Sleep(10) ; Время нахождения курсора над элементом перед щелчком.
MouseClick("left", $iX, $iY, 1, 1)
Sleep(10) ; ждем
MouseUp("left") ; форсируем отжатие
$fMouseMoveBlocked = False ; Разблокировка
ExitLoop
EndIf
$fMouseMoveBlocked = False
Until $i > 5
EndFunc
P.S. Юзер все ещё сможет случайно помешать, для большей надежности можно просто увеличить число попыток.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.