Войти

Показать полную графическую версию : [решено] BlockInputEx и MouseClick несколько вопросов


r35p3ct
24-09-2009, 22:40
В описании к BlockInputEx написано: "2 - Block only mouse", там же в примере
;Here we block only *Mouse* input (without keyboard).
_BlockInputEx(1) В чем подвох?)
Сначала хотел использовать блокирование мышки для того, чтобы во время выполнения случайно не двинуть мышку, но при заблокированной мышке комманда MouseClick тоже не работает. Можно ли как нибудь послать клик в определенную координату и заблокировать мышку?

Creat0R
25-09-2009, 01:29
Для тех кто не вкурсе, речь про самопальную функцию 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}")

r35p3ct
25-09-2009, 11:06
_BlockInputEx(2, "{MPDOWN}|{MPUP}")
MouseClick("left",685,122,1,0)
sleep(1000)
_BlockInputEx(0)
Клик не происходит...
Про первый вариант не понял, суть такая, сижу за компьютером работаю, скрипт например должен кликать через определенное время куда нибудь, вот нужно как нибудь не допустить перемещения мышки в момент клика...

Creat0R
25-09-2009, 11:49
Клик не происходит »
И не должен. Тут ведь функция пытается подвинуть мышку, а её движение блокируется.

Про первый вариант не понял »
Имелось в виду отключение (_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)

r35p3ct
25-09-2009, 13:15
Creat0R, отлично, работает. Только вот не пойму почему происходит такой глюк, поэтому то и думал, что функция глючная с начала и не юзал. Вобщем после выполнения этого кода в моей проге мышка начинает норм шевелиться, но при нажатии например на клаве цифры 3, выполняется мой HotKeySet("!3", "ip"), даже когда программа выключена, тоесть получается как будто залипла клавиша alt...если выполнять этот код отдельным проектом, то норм. При нажатии ctrl+alt+del все нормализуется.
Как найти из за чего такое может быть? {ALTDOWN} или чего то похожего не использую...да и выполнял этот код как отдельную функцию...

Creat0R
25-09-2009, 13:50
Как найти из за чего такое может быть? »
Сложно сказать не видя скрипта. Но если попробовать, то можно сделать такой трюк:

#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)

r35p3ct
25-09-2009, 15:42
Вот что показало вскрытие:

;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 глючит?

Creat0R
25-09-2009, 16:34
Получается BlockInput глючит? »
Нет. Получается что после вызова функции, модифицирующие клавиши (в нашем случае это Alt) не успевают отжиматься до того как BlockInput вступает в силу. В справке ведь написано:

Remarks
If BlockInput is enabled, the Alt keypress cannot be sent!

видимо оно касается и предварительного нажатия юзером. Поэтому решение из моего последнего поста будет оптимальным.

r35p3ct
25-09-2009, 17:22
Если я правильно понял, то решением будет либо не использовать в хоткеях 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

Creat0R
25-09-2009, 18:48
решением будет либо не использовать в хоткеях alt, либо
перед каждым вызовом blockinput сделать так? »
Так точно.

Diamond
26-09-2009, 08:33
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

Creat0R
26-09-2009, 10:37
не легче ли будет использовать для мышки глобальный перехват »
_BlockInputEx использует этот хук. Я только не понимаю смысл блокировки движения мышки перед самим кликом, всё ровно юзер может двигать мышку до клика, и помешать этому :)

Diamond
27-09-2009, 07:29
всё ровно юзер может двигать мышку до клика, и помешать этому »
Теперь вижу, спасибо. :) Тогда так:
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