Что нового

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

KEO

Новичок
Сообщения
26
Репутация
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,557
Репутация
628
KEO [?]
который по умолчанию установлен на -1
блокирует в этот момент действия мыши при клике. то есть скрипт регистрирует нажатие, но окно под указателем мыши не получает команду нажатия. чтобы разблокировать поставь этот параметр равный 0.
твой скрипт у меня работает нормально. не вываливается
 

KEO

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

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

-------

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

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

joiner

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

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

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

KEO

Новичок
Сообщения
26
Репутация
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,673
Репутация
2,486
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,673
Репутация
2,486
lacoil
Приведённый выше скрипт у меня работает нормально.
Поэтому либо это не полный скрипт где проявляется проблема, либо проблема локальная.
 

lacoil

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

Попробовал на многих компах с Win7 x32\64 проблема одна и та же.
пример окна, для которого не происходит перехвата нажатия мыши в прикрепленной картинке
 

Вложения

  • WinEr.png
    WinEr.png
    38.6 КБ · Просмотры: 23
Автор
CreatoR

CreatoR

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

lacoil

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
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,673
Репутация
2,486
Naisho
AutoIt 3.3.10.2 Win 7, подобной проблемы не наблюдаю.
 
Автор
CreatoR

CreatoR

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

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,724
Для подстраховки вылета хука и прочих издевательств со стороны юзеров можно использовать PostMessage() для обработки пользовательской функции, а не обрабатывать ее напрямую в хуке. Это сведет время задержки к минимуму, а весь код будет обрабатываться в обработчике сообщений.
 
Автор
CreatoR

CreatoR

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

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

Yashied

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

P.S

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