Что нового

Мышь, клавиатура MouseOnEvent - Обработка событии мышки

KEO

Новичок
Сообщения
17
Репутация
0
[Мышь, клавиатура] Re: MouseOnEvent - Обработка событии мышки

Скачал последнюю версию (1.9).

Создал такой скрипт:

Код:
#include <MouseOnEvent.au3>

HotKeySet("{F10}","Stop")

Global $Clicking = False

_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT, 'MyMouseClick') ;Обработка событий средней кнопки мыши

While 1
    Sleep(100)
WEnd


Func MyMouseClick()
	$Clicking = NOT $Clicking
	ToolTip('Clicking = ' & $Clicking,300,0)
EndFunc

Func Stop()
	Exit
EndFunc


При нажатии на среднюю кнопку мыши - скрипт работает отлично и ToolTip меняет свой текст как положено.

Однако при нажатии на любую другую кнопку мыши (например на основную 1 раз) - скрипт вываливается (Ведет себя так, как будто его закрыли или вызвали процедуру Exit).

Что я сделал не так ? Как мне сделать, чтобы скрипт не вываливался ?

Если я правильно прочитал первый пост, то написано, что для того чтобы отключить обработку событий мыши, надо вставить соответствующие события без ссылки на функцию

То есть кроме обработки события средней кнопки мыши я вставил сразу же за ней вот эти 4 строчки.

Код:
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_SECONDARYDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)


Не помогло. Всё равно скрипт вываливается при нажатии любой другой (кроме средней) кнопки мыши.


И кстати еще вопрос по этому пакету (MouseOnEvent): А что это за параметр № 4 ($iBlockDefProc), который по умолчанию установлен на -1. Что это за параметр и для чего он вообще нужен ?
 

joiner

Модератор
Локальный модератор
Сообщения
3 385
Репутация
592
KEO [?]
который по умолчанию установлен на -1
блокирует в этот момент действия мыши при клике. то есть скрипт регистрирует нажатие, но окно под указателем мыши не получает команду нажатия. чтобы разблокировать поставь этот параметр равный 0.
твой скрипт у меня работает нормально. не вываливается
 

KEO

Новичок
Сообщения
17
Репутация
0
То есть параметр "-1" чтобы блокировать, а параметр "0" чтобы не блокировать ?

Не вываливается говоришь ? Странно... А у меня почему тогда вываливается ? Win7 64bit (на всякий случай).

-------

Попробовал только что этот же скрипт на другом компе (на своем настольном, все библиотеки и инклуды там есть, и система такая же - Win7 64bit) - тоже самое. Однако попробовал этот же скрипт на Windows XP (которую я запустил как Виртуальную машину через VMWare) - там всё работает нормально, не вываливается.
Откомпилировал скрипт под x86 (и просто запускал в режиме x86, без компиляции) - заработало отлично на Win7 64

Есть идеи в чём проблема ?
 

joiner

Модератор
Локальный модератор
Сообщения
3 385
Репутация
592
KEO [?]
То есть параметр "-1" чтобы блокировать, а параметр "0" чтобы не блокировать ?
Код:
_MouseSetOnEvent($iEvent, $sFuncName="", $sParam1="", $sParam2="", $hTargetWnd=0, $iBlockDefProc=1)

последний параметр равен единицы. то есть блокировать. соответственно 0 - не блокировать
в твоем случае это так
Код:
_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT, 'MyMouseClick','','',0,0)

твой скрипт проверял на семерке х32 и х64.
не вываливается
 

KEO

Новичок
Сообщения
17
Репутация
0
joiner [?]
твой скрипт проверял на семерке х32 и х64. не вываливается
Ну фиг его знает, если честно. Может моя "семерка" такая глючная. Их же много разных билдов. Моя 7-ка одна из первых появившихся и без сервиспака. :smile:

В общем я запускаю скрипт в режиме x86 и все работает. Правда есть ньюанс: если запускать скрипт под управлением самой AutoIT - работает вообще как часы. А если откомпилированный exe-шник - иногда подглюкивает.

И таки-да: напрочь не работает событие двойного нажатия средней кнопки мыши. Хотел на неё повесить свой скрипт.
$MOUSE_WHEELDBLCLK_EVENT ;Двойное нажатие средней кнопки.

Кстати, чуть позже проверю на XP.
 

lacoil

Новичок
Сообщения
9
Репутация
1
Пытаюсь использовать данный udf. В целом работает отлично, но столкнулся со следующей проблемой:
Для некоторых окон не отрабатывает хук (не отрабатывает функция при нажатии в этом окне)
Примером такого окна является Network Connection Properties (окно настроек сетевого подключения)

Кто-нибудь подскажет как с таким бороться?

Код:
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT,"_tooltip",0,0)

while 1
	sleep (100)
WEnd

Func _tooltip()
	ToolTip("Got it")
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
lacoil [?]
Примером такого окна является Network Connection Properties (окно настроек сетевого подключения)
Какая система, версия AutoIt, версия библиотеки?
 

lacoil

Новичок
Сообщения
9
Репутация
1
Creato.9R сказал(а):
lacoil [?]
Примером такого окна является Network Connection Properties (окно настроек сетевого подключения)
Какая система, версия AutoIt, версия библиотеки?
OS: Windows 7 x64 SP1
Autoit version: v3.3.12.0
MouseOnEvent UDF: v1.9

Кстати, при компеляции скрипт отрабатывает только в x86 режиме. Если скомпилировать в x64, то происходит падение приложения.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
lacoil
Приведённый выше скрипт у меня работает нормально.
Поэтому либо это не полный скрипт где проявляется проблема, либо проблема локальная.
 

lacoil

Новичок
Сообщения
9
Репутация
1
CreatoR сказал(а):
lacoil
Приведённый выше скрипт у меня работает нормально.
Поэтому либо это не полный скрипт где проявляется проблема, либо проблема локальная.
Попробовал на многих компах с Win7 x32\64 проблема одна и та же.
пример окна, для которого не происходит перехвата нажатия мыши в прикрепленной картинке
 

Вложения

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
lacoil
А если вместо tooltip указать msgbox?
 

lacoil

Новичок
Сообщения
9
Репутация
1
с MsgBox тоже не отлавливает нажатия в этом окне :( К тому же падает часто после того как MsgBox появляется, но не суть.
Окон подобно этому достаточно много :mad:

Может есть мысли почему так может быть? А то функция уж больно хорошая :ok:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
lacoil [?]
Может есть мысли почему так может быть?
Для уточнения - подобное происходит конкретно с вышеприведённым скриптом, или это только отрывок/пример скрипта?
 

Naisho

Знающий
Сообщения
86
Репутация
12
проблемка с падением 64х битного скрипта
Код:
#AutoIt3Wrapper_UseX64=Y
#include "MouseOnEvent.au3"

$Form1 = GUICreate("some gui", 333, 222, @DesktopWidth/2-175, @DesktopHeight/2-111)
$Input1 = GUICtrlCreateInput("some text", 8, 8, 921, 21)
GUISetState(@SW_SHOW)
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, '_DblClk_Event')

While 1
    Sleep(10)
WEnd
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT)


результат - всегда AutoIt3.exe ended.rc:128 причём не сразу, а через небольшое время после клика (одиночного) по окошку - в оригинальном скрипте успевает по клику на кнопке войти в функцию и на долю секунды показать Msgbox установленный туда для отлова ошибки. После - падает со 128-ой ошибкой.

Может задержка как то связана со временем даблклика? Как бы это побороть?

да:
ХР64, Autoit v3.3.10.2; 3.3.12.0; 3.3.14.0
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
Naisho
AutoIt 3.3.10.2 Win 7, подобной проблемы не наблюдаю.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
Обновление:

v2.0 [08.08.2015]
* Добавлена альтернативная функция _MouseSetOnEvent_RI с использованием Raw Input Data вместо системного хука. !!! Эта функция не поддерживает $iBlockDefProc.
* Добавлена поддержка определения XBUTTON2. Используйте $MOUSE_XBUTTON2DOWN_EVENT, $MOUSE_XBUTTON2UP_EVENT, и $MOUSE_XBUTTON2DBLCLK_EVENT константы для определения XBUTTON и XBUTTON2.
* Косметические изменения в коде.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Для подстраховки вылета хука и прочих издевательств со стороны юзеров можно использовать PostMessage() для обработки пользовательской функции, а не обрабатывать ее напрямую в хуке. Это сведет время задержки к минимуму, а весь код будет обрабатываться в обработчике сообщений.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 605
Репутация
2 437
madmasles [?]
3.3.6.1 - 3.3.8.1 уже не поддерживаются.
Да, из за включения версии с RawInput. Поправил шапку и список изменений.

Yashied [?]
можно использовать PostMessage() для обработки пользовательской функции, а не обрабатывать ее напрямую в хуке
А можно пример как лучше это сделать?
Также нужно учесть параметр $iBlockDefProc, чтобы осталась возможность блокировки события при необходимости.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
CreatoR, сложно разбираться в коде, но смысл сводится к следующему. Вместо Call() ты вызываешь _WinAPI_PostMessage() в собственное невидимое окно, как передать строковый параметр (название пользовательской функции), я думаю ты сам разберешься. Как вариант можно через _WinAPI_CreatеString(), _WinAPI_GetString() и _WinAPI_FreeMemory(). Весь остальной код менять не нужно. В результате мы получаем безтормозной хук, т.к. PostMessage() в отличии от SendMessage() не ждет завершения выполнения обработчика.

P.S

Сообщение можешь посылать любое из диапазона 0x8000-0xFFFF или зарегистрировать с помощью _WinAPI_RegisterWindowMessage().
 
Верх