Автор Тема: MouseOnEvent - Обработка событии мышки  (Прочитано 54357 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #60, Отправлен: Август 11, 2015, 16:40:25 »
Yashied  [?]
Цитировать
В результате мы получаем безтормозной хук
Да, но как быть с возможностью блокировать событие? Ведь для блокировки на данный момент я использую возврат 1 или 0 вместо _WinAPI_CallNextHookEx.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: MouseOnEvent - Обработка событии мышки
« Ответ #60 Отправлен: Август 11, 2015, 16:40:25 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #61, Отправлен: Август 11, 2015, 21:35:29 »
Yashied  [?]
Цитировать
Как вариант можно через _WinAPI_CreatеString(), _WinAPI_GetString() и _WinAPI_FreeMemory(). Весь остальной код менять не нужно. В результате мы получаем безтормозной хук, т.к. PostMessage() в отличии от SendMessage() не ждет завершения выполнения обработчика.
Я так понимаю что для _WinAPI_GetString нужно использовать _WinAPI_SetMessageExtraInfo, но оно не работает с PostMessage, т.к функция _WinAPI_IsMemory возвращает False.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseOnEvent - Обработка событии мышки
« Ответ #62, Отправлен: Август 11, 2015, 22:22:29 »
Не нужно никаких "ExtraInfo". Создаешь в памяти строку и получаешь хэндл:

Код: AutoIt [Выделить]
$hFunc = _WinAPI_CreateString("UserFunctionName")


Передаешь хэндл посредством "wParam":

Код: AutoIt [Выделить]
_WinAPI_PostMessage($hMyWnd, $WM_MYMSG, $hFunc, Null)


В обработчике WM_MYMSG делаешь следующее:

Код: AutoIt [Выделить]
$sFunc = _WinAPI_GetString($wParam)
_WinAPI_FreeMemory($wParam) ; !!!
Call($sFunc, ...)


P.S

Код: AutoIt [Выделить]
$hMyWnd = GUICreate("")
$WM_MYMSG = _WinAPI_RegisterWindowMessage("{1A7BEE00-00C8-4692-BA2B-13EA8B3AA6A1}")

« Последнее редактирование: Август 11, 2015, 23:48:40 от CreatoR »


Думай, прежде чем говорить.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #63, Отправлен: Август 12, 2015, 00:03:57 »
Yashied
А как быть если кроме имени функции, мне нужно ещё и пользовательский параметр передать, можно как то массив в памяти передать?

Русское сообщество AutoIt

Re: MouseOnEvent - Обработка событии мышки
« Ответ #63 Отправлен: Август 12, 2015, 00:03:57 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7789
  • Репутация: 2313
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseOnEvent - Обработка событии мышки
« Ответ #64, Отправлен: Август 12, 2015, 07:13:01 »
CreatoR,
А если передавать индекс в массиве, а не строку с именем функции?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseOnEvent - Обработка событии мышки
« Ответ #65, Отправлен: Август 12, 2015, 12:41:25 »
Если возможно, то да, проще передать индекс.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #66, Отправлен: Август 12, 2015, 16:33:01 »
Обновление:

Цитировать
v2.1 [12.08.2015]
* Теперь если $iBlockDefProc = 0 (или при использовании _MouseSetOnEvent_RI), пользовательская функция $sFuncName вызывается посредством PostMessage для предотвращения проблем с задержкой хука (или WM_* сообщений).
* Косметические изменения в коде.
* Обновление документации.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7789
  • Репутация: 2313
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseOnEvent - Обработка событии мышки
« Ответ #67, Отправлен: Август 13, 2015, 08:29:52 »
CreatoR,
ИМХО, если в _WinAPI_PostMessage() передавать индекс в массивах $a__MSOE_Events_RI и $a__MSOE_Events не строкой, а числом (например, для $a__MSOE_Events_RI со знаком минус, а для $a__MSOE_Events со знаком плюс, чтобы их можно было различать), то можно упростить код и не использовать функции _WinAPI_CreateString(), _WinAPI_GetString() и _WinAPI_FreeMemory().

И еще. Если поменять в MouseOnEvent.au3 файлы #include на
Код: AutoIt [Выделить]
#include-once
#include <WinAPIEx.au3>
#include <APIConstants.au3>
;~ #include <WinAPIGdi.au3>
;~ #include <WinAPIMisc.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>

то Ваша UDF прекрасно работает и в версиях AutoIt 3.3.6.1 - 3.3.8.1

PS
Все это я проверил - работает.
« Последнее редактирование: Август 13, 2015, 08:57:07 от madmasles »

Русское сообщество AutoIt

Re: MouseOnEvent - Обработка событии мышки
« Ответ #67 Отправлен: Август 13, 2015, 08:29:52 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #68, Отправлен: Август 13, 2015, 17:58:22 »
Обновление...

Цитировать
v2.2 [13.08.2015]
* Снова поддерживается AutoIt 3.3.6.1 - 3.3.8.1.
* Улучшение в коде и косметические изменения.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #69, Отправлен: Ноябрь 04, 2015, 13:53:56 »
Обновление...

Цитировать
v2.3 [04.11.2015]
* Добавлены пользовательские константы $MOE_RUNDEFPROC и $MOE_BLOCKDEFPROC, для возврата значения в функции события.
* Исправлена проблема с падением скрипта при изменении массива событии.
* Исправлена проблема с нагрузкой на ЦП вызываемая неправильным использованием timer kill.
* Обновлена документация.

Оффлайн Vovsla [?]

  • Осваивающий
  • **
  • Сообщений: 458
  • Репутация: 24
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: MouseOnEvent - Обработка событии мышки
« Ответ #70, Отправлен: Февраль 01, 2016, 16:33:44 »
Autoit 3.3.10.2
Если блокировать одиночное нажатие кнопки мыши, а потом разблокировать только одиночное нажатие, то DBLCLK остается заблокированным.

Код: AutoIt [Выделить]
#include <MouseOnEvent.au3>

HotKeySet("{ESC}", "_Quit")


;~ _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MousePrimaryDown_Event")
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MousePrimaryDown_Event", 0, 1)
;~ _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, Default, 0, 1)
ConsoleWrite('block'&@CRLF)
Sleep(5000)
ToolTip('')
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
;~ _MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT)
ConsoleWrite('unblock'&@CRLF)


While 1
    Sleep(100)
WEnd



Func _MousePrimaryDown_Event()
    ToolTip("Primary Mouse Button Down Blocked")
EndFunc


Func _Quit()
    Exit
EndFunc
 



Добавлено: Февраль 01, 2016, 17:20:14
Полностью блокирует мышку, но если во время блокирования мышки активно ей пользоваться - двигать и нажимать кнопки, то после разблокировки она сильно тормозит какое-то время

Код: AutoIt [Выделить]
#include <MouseOnEvent.au3>

HotKeySet("{ESC}", "_Quit")

_MouseSetOnEvent($MOUSE_MOVE_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_SECONDARYDOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_SECONDARYDBLCLK_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_WHEELUP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_WHEELDBLCLK_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_WHEELSCROLL_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_XBUTTONDOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_XBUTTONUP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_XBUTTONDBLCLK_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_XBUTTON2DOWN_EVENT, "_Mouse_Event", 0, 1)
    _MouseSetOnEvent($MOUSE_XBUTTON2UP_EVENT, "_Mouse_Event", 0, 1)
_MouseSetOnEvent($MOUSE_XBUTTON2DBLCLK_EVENT, "_Mouse_Event", 0, 1)


Sleep(10000)


_MouseSetOnEvent($MOUSE_MOVE_EVENT)
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_SECONDARYDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT)
_MouseSetOnEvent($MOUSE_SECONDARYDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELUP_EVENT)
_MouseSetOnEvent($MOUSE_WHEELDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_WHEELSCROLL_EVENT)
_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT)
_MouseSetOnEvent($MOUSE_XBUTTONDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_XBUTTONUP_EVENT)
_MouseSetOnEvent($MOUSE_XBUTTONDBLCLK_EVENT)
_MouseSetOnEvent($MOUSE_XBUTTON2DOWN_EVENT)
    _MouseSetOnEvent($MOUSE_XBUTTON2UP_EVENT)
_MouseSetOnEvent($MOUSE_XBUTTON2DBLCLK_EVENT)


While 1
    Sleep(100)
WEnd



Func _Mouse_Event()
;~  ToolTip('Мышка заблокирована')
EndFunc


Func _Quit()
    Exit
EndFunc

 

« Последнее редактирование: Февраль 01, 2016, 17:20:14 от Vovsla, Причина: Объединение сообщений »

Оффлайн Aleksandr Prilutskiy [?]

  • Новичок
  • *
  • Сообщений: 28
  • Репутация: 9
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: MouseOnEvent - Обработка событии мышки
« Ответ #71, Отправлен: Ноябрь 08, 2016, 22:28:45 »
Хочу чтобы при нажатии на среднюю клавишу мыши проигрывался звук.
Работает, но 1 раз... Чтобы сработало 2й раз приходится выходить из программы.

Код: AutoIt [Выделить]
#include "MouseOnEvent.au3"
HotKeySet("{ESC}", "_Quit")
_MouseSetOnEvent($MOUSE_WHEELDOWN_EVENT, "_DOWN_EVENT")

While 1
 Sleep(100)
WEnd

Func _DOWN_EVENT()
 SoundPlay("alarm.wav", 1)
EndFunc

Func _Quit()
 Exit
EndFunc


версия MouseOnEvent.au3 2.3

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

Оффлайн Malderin [?]

  • Новичок
  • *
  • Сообщений: 32
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: MouseOnEvent - Обработка событии мышки
« Ответ #72, Отправлен: Март 17, 2017, 10:27:14 »
На рабочем ПК, где стоит WinXP все работает прекрасно, но вот на домашнем ПК, где стоит Win7 x64 Pro та же проблема что и у Aleksandr Prilutskiy. 1-2 раза скрипт отрабатывает, потом сколько не нажимай на забитую в скрипт клавишу мышки, реакции никакой. Помогает только перезапуск скрипта. С _Ispressed таких проблем не наблюдается, но там нет возможности забить функции на дополнительные кнопки мыши. В общем непонятно что тут не так и почему обработка нажатий так внезапно прекращается.

Оффлайн reset86 [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 0
  • Пол: Мужской
    • nvjob
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: MouseOnEvent - Обработка событии мышки
« Ответ #73, Отправлен: Март 17, 2017, 12:46:54 »
Win 10, работает некорректно, курсор, после разблокировки мыши, ведет себя как пьяный. Я так понял, проблема в самом хуке _WinAPI_SetWindowsHookEx.

Вариант 1:
(нажмите для показа/скрытия)
Вариант 2:
(нажмите для показа/скрытия)
Вариант 3 (не в цикле)
(нажмите для показа/скрытия)

Очень жаль, но проблему решить с этой UDF так и не смог. Приходится использовать _IsPressed('01'), при нажатии, под курсором создается невидимый GUI по верх окна, тем самым блокируется нажатие мыши, это криво и не правильно, хотелось бы использовать все таки эту UDF. BlockInputEx.au3, работает с мышью еще хуже (с клавиатурой работает идеально).

Невидимый GUI под курсором в момент нажатия.
(нажмите для показа/скрытия)
« Последнее редактирование: Март 17, 2017, 14:50:51 от reset86 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7773

  • Автор темы
  • Репутация: 2276
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseOnEvent - Обработка событии мышки
« Ответ #74, Отправлен: Март 23, 2017, 01:26:37 »
reset86  [?]
Цитировать
Win 10, работает некорректно, курсор, после разблокировки мыши, ведет себя как пьяный
При чём тут разблокировка, эта библиотека не предназначена для блокировки чего либо (хотя и имеет такую возможность).

Цитировать
проблему решить с этой UDF так и не смог
В чём она заключается, что ты пытаешься сделать?

У меня с выше представленным скриптом курсор нормально работает (Win 10, AutoIt 3.3.14.2).

Русское сообщество AutoIt

Re: MouseOnEvent - Обработка событии мышки
« Ответ #74 Отправлен: Март 23, 2017, 01:26:37 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
60 Ответов
30298 Просмотров
Последний ответ Июль 04, 2012, 15:50:30
от CreatoR
11 Ответов
8715 Просмотров
Последний ответ Март 23, 2017, 01:38:24
от CreatoR
3 Ответов
7238 Просмотров
Последний ответ Июль 10, 2010, 17:54:08
от spider_xr
8 Ответов
3537 Просмотров
Последний ответ Апрель 05, 2012, 09:40:35
от madmasles
6 Ответов
2309 Просмотров
Последний ответ Март 16, 2014, 23:06:37
от madmasles
3 Ответов
2733 Просмотров
Последний ответ Март 27, 2014, 22:01:09
от AZJIO
9 Ответов
1806 Просмотров
Последний ответ Апрель 24, 2015, 17:23:51
от Крепыш
0 Ответов
894 Просмотров
Последний ответ Апрель 02, 2015, 16:13:06
от madmasles
15 Ответов
11685 Просмотров
Последний ответ Май 02, 2016, 02:36:31
от CreatoR
2 Ответов
831 Просмотров
Последний ответ Январь 10, 2016, 21:03:23
от Alofa