Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] BlockInputEx и MouseClick несколько вопросов (http://forum.oszone.net/showthread.php?t=151414)

r35p3ct 24-09-2009 22:40 1226805

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

Creat0R 25-09-2009 01:29 1226909

Для тех кто не вкурсе, речь про самопальную функцию BlockInputEx.

Цитата:

Цитата r35p3ct
В чем подвох? »

Ни в чём, это просто ошибка в примере. Поправлено в последней версии.

Цитата:

Цитата r35p3ct
Сначала хотел использовать блокирование мышки для того, чтобы во время выполнения случайно не двинуть мышку, но при заблокированной мышке комманда MouseClick тоже не работает. Можно ли как нибудь послать клик в определенную координату и заблокировать мышку? »

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

Код:

;Here we block *Mouse* input, except the mouse primary click.
_BlockInputEx(2, "{MPDOWN}|{MPUP}")


r35p3ct 25-09-2009 11:06 1227058

Код:

_BlockInputEx(2, "{MPDOWN}|{MPUP}")
MouseClick("left",685,122,1,0)
sleep(1000)
_BlockInputEx(0)

Клик не происходит...
Про первый вариант не понял, суть такая, сижу за компьютером работаю, скрипт например должен кликать через определенное время куда нибудь, вот нужно как нибудь не допустить перемещения мышки в момент клика...

Creat0R 25-09-2009 11:49 1227100

Цитата:

Цитата r35p3ct
Клик не происходит »

И не должен. Тут ведь функция пытается подвинуть мышку, а её движение блокируется.

Цитата:

Цитата r35p3ct
Про первый вариант не понял »

Имелось в виду отключение (_BlockInputEx(0)) блокировки на время клика.

Цитата:

Цитата r35p3ct
суть такая, сижу за компьютером работаю, скрипт например должен кликать через определенное время куда нибудь, вот нужно как нибудь не допустить перемещения мышки в момент клика... »

Ну, это совсем другая задача, тут _BlockInputEx не поможет, не для этих целей он делался.
Для этого лучше использовать обычный BlockInput:

Код:

BlockInput(1)
MouseClick("Main", 685, 122, 1, 0)
Sleep(1000)
BlockInput(0)


r35p3ct 25-09-2009 13:15 1227172

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

Creat0R 25-09-2009 13:50 1227202

Цитата:

Цитата r35p3ct
Как найти из за чего такое может быть? »

Сложно сказать не видя скрипта. Но если попробовать, то можно сделать такой трюк:

Код:

#include <Misc.au3>

HotKeySet("!3", "ip")

;....

Func ip()
    ;Ждём пока нажата клавиша Alt
    While _IsPressed(12)
        Sleep(10)
    WEnd

    ;тут содержание функции
EndFunc


r35p3ct 25-09-2009 15:42 1227290

Вот что показало вскрытие:
Код:

;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 1227328

Цитата:

Цитата r35p3ct
Получается BlockInput глючит? »

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

Цитата:

Цитата http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm
Remarks
If BlockInput is enabled, the Alt keypress cannot be sent!

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

r35p3ct 25-09-2009 17:22 1227352

Если я правильно понял, то решением будет либо не использовать в хоткеях 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 1227392

Цитата:

Цитата r35p3ct
решением будет либо не использовать в хоткеях alt, либо
перед каждым вызовом blockinput сделать так? »

Так точно.

Diamond 26-09-2009 08:33 1227696

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 1227731

Цитата:

Цитата Diamond
не легче ли будет использовать для мышки глобальный перехват »

_BlockInputEx использует этот хук. Я только не понимаю смысл блокировки движения мышки перед самим кликом, всё ровно юзер может двигать мышку до клика, и помешать этому :)

Diamond 27-09-2009 07:29 1228428

Цитата:

Цитата Creat0R
всё ровно юзер может двигать мышку до клика, и помешать этому »

Теперь вижу, спасибо. :) Тогда так:
Код:

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. Юзер все ещё сможет случайно помешать, для большей надежности можно просто увеличить число попыток.


Время: 17:33.

Время: 17:33.
© OSzone.net 2001-