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

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7758
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
AutoIt: 3.3.6.1 - 3.3.14.1
Версия: 2.3
Категория: Мышь и клавиатура
Описание: Позволяет установить обработку событии мышки. Кроме прочего, поддерживает блокировку событии в определённом окне.

Примечания:
(нажмите для показа/скрытия)

Пример:
(нажмите для показа/скрытия)

Поддерживаемые константы событии:
Код: AutoIt [Выделить]
  1. $MOUSE_MOVE_EVENT ;Движение мышки.
  2. $MOUSE_PRIMARYDOWN_EVENT ;Зажатие главной кнопки.
  3. $MOUSE_PRIMARYUP_EVENT ;Отжатие главной кнопки.
  4. $MOUSE_PRIMARYDBLCLK_EVENT ;Двойное нажатие главной кнопки.
  5. $MOUSE_SECONDARYDOWN_EVENT ;Зажатие вторичной кнопки.
  6. $MOUSE_SECONDARYUP_EVENT ;Отжатие вторичной кнопки.
  7. $MOUSE_SECONDARYDBLCLK_EVENT ;Двойное нажатие вторичной кнопки.
  8. $MOUSE_WHEELDOWN_EVENT ;Зажатие средней кнопки.
  9. $MOUSE_WHEELUP_EVENT ;Отжатие средней кнопки.
  10. $MOUSE_WHEELDBLCLK_EVENT ;Двойное нажатие средней кнопки.
  11. $MOUSE_WHEELSCROLL_EVENT ;Прокручивание коллёсика средней кнопки.
  12. $MOUSE_WHEELSCROLLDOWN_EVENT ;Прокручивание коллёсика средней кнопки вниз.
  13. $MOUSE_WHEELSCROLLUP_EVENT ;Прокручивание коллёсика средней кнопки вверх.
  14. $MOUSE_XBUTTONDOWN_EVENT ;Зажатие боковой кнопки (обычно это кнопки навигации).
  15. $MOUSE_XBUTTONUP_EVENT ;Отжатие боковой кнопки.
  16. $MOUSE_XBUTTONDBLCLK_EVENT ;Двойное нажатие боковой кнопки.
  17. $MOUSE_XBUTTON2DOWN_EVENT ;Зажатие боковой кнопки #2 (обычно это кнопки навигации).
  18. $MOUSE_XBUTTON2UP_EVENT ;Отжатие боковой кнопки #2.
  19. $MOUSE_XBUTTON2DBLCLK_EVENT ;Двойное нажатие боковой кнопки #2.


Скачать: MouseOnEvent.zip

Источник: CreatoR, http://www.autoitscript.com/forum/index.php?showtopic=64738
« Последнее редактирование: Ноябрь 04, 2015, 13:50:14 от CreatoR »


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


AutoIt is simple, subtle, elegant.


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


Мои работы

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

MouseOnEvent - Обработка событии мышки
« Отправлен: Сентябрь 30, 2009, 03:40:32 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #1, Отправлен: Сентябрь 30, 2009, 10:09:15 »
Отличная идея, но почему ты игнорируешь требования Microsoft, относительно Hook функций.


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

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #2, Отправлен: Сентябрь 30, 2009, 14:48:28 »
Yashied [?]
Цитировать
почему ты игнорируешь требования Microsoft, относительно Hook функций.
Что именно?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #3, Отправлен: Сентябрь 30, 2009, 16:13:16 »
Что именно?

Цитата: Microsoft
If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If nCode is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_MOUSE_LL hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.

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

Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #3 Отправлен: Сентябрь 30, 2009, 16:13:16 »

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #4, Отправлен: Сентябрь 30, 2009, 16:20:07 »
Yashied [?]
Цитировать
CallNextHookEx
А ну да, я забыл про это, UDF писал давно и на основе примерочного хука, где не все правила (условия?) хука были соблюдены. Поправил, позже перевыложу.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #5, Отправлен: Сентябрь 30, 2009, 16:29:17 »
Если бы не это, то он вообще бы подвесил систему.

Цитата: Microsoft
The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:

HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure does not return during this interval, the system will pass the message to the next hook.

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #6, Отправлен: Октябрь 09, 2009, 07:53:41 »
Обновление UDF...

Цитировать
v1.5 [09.10.2009]
+ Добавлено распознавание прокрутки коллёсика мышки вверх и вниз. Спасибо JRowe (http://www.autoitscript.com/forum/index.php?showtopic=103362).
* Исправлена проблема с возвращаемым значением от __MouseSetOnEvent_MainHandler - следует вызывать _WinAPI_CallNextHookEx до завершения функции (спасибо Yashied).
* Константы начинающиеся с MOUSE_EXTRABUTTON* переименованы в MOUSE_XBUTTON*, как и должно было быть изначально.
* Обновлены некоторые примеры.

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #7, Отправлен: Октябрь 13, 2009, 18:49:18 »
И ещё одно мелкое обновление...

Цитировать
v1.6 [13.10.2009]
* Исправлена проблема с высвобождением русурсов хука при выходе или при удалении последнего события (спасибо wraithdu).

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

Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #7 Отправлен: Октябрь 13, 2009, 18:49:18 »

Оффлайн StepanSkvortsov [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #8, Отправлен: Май 31, 2010, 21:08:31 »
Отличные функции, спасибо!

Заметил ошибку в работе при выполнении следующего скрипта:
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <MouseSetOnEvent_UDF.au3>
HotKeySet("{ESC}", "_Quit")
;main loop
While 1
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_MOUSEWHEELUP_EVENT")
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_MOUSEWHEELDOWN_EVENT")
    Sleep(250)
    ToolTip("")
WEnd
;tooltip if WHEEL.SCROLL.UP detected
Func _MOUSEWHEELUP_EVENT()
    ToolTip("wheel UP detected")
EndFunc
;tooltip if WHEEL.SCROLL.DOWN detected
Func _MOUSEWHEELDOWN_EVENT()
    ToolTip("wheel DOWN detected")
EndFunc
;exit from script by ESC
Func _Quit()
    Exit
EndFunc
 


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

C:\Program Files\AutoIt3\Include\MouseSetOnEvent_UDF.au3 (201) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If $__MouseSetOnEvent_aEvents[$i][0] = $iEvent Or $__MouseSetOnEvent_aEvents[$i][0] = $iEvent+8 Or $__MouseSetOnEvent_aEvents[$i][0] = $iEvent+16 Then
If ^ ERROR
C:\Program Files\AutoIt3\Include\MouseSetOnEvent_UDF.au3 (201) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If $__MouseSetOnEvent_aEvents[$i][0] = $iEvent Or $__MouseSetOnEvent_aEvents[$i][0] = $iEvent+8 Or $__MouseSetOnEvent_aEvents[$i][0] = $iEvent+16 Then
If ^ ERROR

Для справки прикладываю переменные окружения:
AutoIt3Wrapper v.2.0.1.24
AutoIt3 v.3.3.6.1
Language:0419 Keyboard:00000409 OS:WIN_7 CPU:X64 OS:X86

Надеюсь, это поможет найти и исправить ошибки. Спасибо.

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #9, Отправлен: Июнь 01, 2010, 09:59:03 »
StepanSkvortsov
А зачем в цикле задавать события?

Конечно библиотека не должна так вываливаться с ошибкой...

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #10, Отправлен: Июнь 01, 2010, 12:41:04 »
StepanSkvortsov  [?]
Цитировать
Заметил ошибку в работе
Какая версия UDF?

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #11, Отправлен: Июнь 02, 2010, 22:46:20 »
Обновление UDF...

Цитировать
v1.8 [02.06.2010]
* Исправлена проблема связанная с установкой $MOUSE_XBUTTONUP/DOWN_EVENT и других событии.
* Исправлена проблема связанная с попыткой пользователя установить дополнительную функцию на уже установленное событие.
  - Теперь имя функции и другие параметры заменяются для указанного события.
* Переименован файл библиотеки (убрано "Set" по середине и "_UDF" в конце имени).
* Косметические изменения в коде библиотеки.
* Обновление документации.

Оффлайн StepanSkvortsov [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #12, Отправлен: Июнь 03, 2010, 01:33:51 »
UDF версии 1.7 (пробовал и 1.6 - та же ошибка).
Согласен, в цикле не надо было делать;) Возможно, в этом и была причина...
Опробую новую 1.8, о результатах доложу.
Спасибо за оперативность:)


Добавлено: Июнь 03, 2010, 02:04:39
Опробовал версию 1.8 (из цикла установку события вывел):
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <MouseSetOnEvent_UDF.au3>
HotKeySet("{ESC}", "_Quit")
;main loop
_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_MOUSEWHEELUP_EVENT")
_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_MOUSEWHEELDOWN_EVENT")
While 1
    Sleep(250)
    ToolTip("")
WEnd
;tooltip if WHEEL.SCROLL.UP detected
Func _MOUSEWHEELUP_EVENT()
    ToolTip("wheel UP detected")
EndFunc
;tooltip if WHEEL.SCROLL.DOWN detected
Func _MOUSEWHEELDOWN_EVENT()
    ToolTip("wheel DOWN detected")
EndFunc
;exit from script by ESC
Func _Quit()
    Exit
EndFunc
 

Да! Изумительно работает, спасибо.
Но, мышь двигается ОЧЕНЬ медленно, с запозданием:(
Глянул на код - разобраться конечно не смог, но бросилось в глаза огромное количество IF, возможно в этом причина эффекта движения курсора "как в густом сиропе".
Попробовал реализовать аналогичную функцию на основе IsPressedUDF, цинично добавив блоки
для UP и DOWN на основе _IsWheelKeyScroll:
Код: AutoIt [Выделить]
; #FUNCTION# ===================================================================
; Name :            _IsWheelKeyScrollUp
;Global Const $MOUSE_WHEELSCROLLDOWN_EVENT  = 0x20A + 8 ;530
;Global Const $MOUSE_WHEELSCROLLUP_EVENT        = 0x20A + 16 ;538
;===============================================================================
Func _IsWheelKeyScrollUp()
    Local Const $WH_MOUSE_LL = 14

    Local $hCallback_KeyHook = DllCallbackRegister('__WheelKeyScrollUp_Callback', 'int', 'int;ptr')
    Local $hM_Module = DllCall('kernel32.dll', 'hwnd', 'GetModuleHandle', 'ptr', 0)

    Local $hM_Hook = DllCall('user32.dll', 'hwnd', 'SetWindowsHookEx', 'int', $WH_MOUSE_LL, _
            'ptr', DllCallbackGetPtr($hCallback_KeyHook), 'hwnd', $hM_Module[0], 'dword', 0)

    Sleep(100) ;Wait some moments until the variable is set by callback function

    If IsPtr($hCallback_KeyHook) Then
        DllCallbackFree($hCallback_KeyHook)
        $hCallback_KeyHook = 0
    EndIf

    If IsArray($hM_Hook) And $hM_Hook[0] > 0 Then
        DllCall('user32.dll', 'int', 'UnhookWindowsHookEx', 'hwnd', $hM_Hook[0])
        $hM_Hook[0] = 0
    EndIf

    If $IsWheelKeyScrollUp = True Then
        $IsWheelKeyScrollUp = False
        Return 1
    EndIf
EndFunc   ;==>_IsWheelKeyScrollUp

Func __WheelKeyScrollUp_Callback($nCode, $wParam)
    Local Const $MOUSE_WheelSCROLL_UP_EVENT = 538
    Local $iEvent = BitAND($wParam, 0xFFFF)

    $IsWheelKeyScrollUp = ($iEvent = $MOUSE_WheelSCROLL_UP_EVENT)

    Return 0
EndFunc   ;==>__WheelKeyScroll_Callback

; #FUNCTION# ===================================================================
; Name :            _IsWheelKeyScrollDown
;===============================================================================
Func _IsWheelKeyScrollDown()
    Local Const $WH_MOUSE_LL = 14

    Local $hCallback_KeyHook = DllCallbackRegister('__WheelKeyScrollDown_Callback', 'int', 'int;ptr')
    Local $hM_Module = DllCall('kernel32.dll', 'hwnd', 'GetModuleHandle', 'ptr', 0)

    Local $hM_Hook = DllCall('user32.dll', 'hwnd', 'SetWindowsHookEx', 'int', $WH_MOUSE_LL, _
            'ptr', DllCallbackGetPtr($hCallback_KeyHook), 'hwnd', $hM_Module[0], 'dword', 0)

    Sleep(100) ;Wait some moments until the variable is set by callback function

    If IsPtr($hCallback_KeyHook) Then
        DllCallbackFree($hCallback_KeyHook)
        $hCallback_KeyHook = 0
    EndIf

    If IsArray($hM_Hook) And $hM_Hook[0] > 0 Then
        DllCall('user32.dll', 'int', 'UnhookWindowsHookEx', 'hwnd', $hM_Hook[0])
        $hM_Hook[0] = 0
    EndIf

    If $IsWheelKeyScrollDown = True Then
        $IsWheelKeyScrollDown = False
        Return 1
    EndIf
EndFunc   ;==>_IsWheelKeyScrollDown

Func __WheelKeyScrollDown_Callback($nCode, $wParam)
    Local Const $MOUSE_WheelSCROLL_DOWN_EVENT = 530
    Local $iEvent = BitAND($wParam, 0xFFFF)

    $IsWheelKeyScrollDown = ($iEvent = $MOUSE_WheelSCROLL_DOWN_EVENT)

    Return 0
EndFunc   ;==>__WheelKeyScroll_CallbackDown
 

Но увы, не сработало:( При это событие вращения колеса (без указания направления) исправно работает, и мышь двигается без какого-либо заметного торможения.
« Последнее редактирование: Июнь 03, 2010, 02:04:39 от StepanSkvortsov, Причина: Объединение сообщений »

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2274
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #13, Отправлен: Июнь 03, 2010, 09:56:46 »
StepanSkvortsov  [?]
Цитировать
Опробовал версию 1.8
А почему тогда имя UDF старое?

Цитировать
мышь двигается ОЧЕНЬ медленно, с запозданием
Не замечаю такого у себя.

Оффлайн xklx [?]

  • Новичок
  • *
  • Сообщений: 50
  • Репутация: 3
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #14, Отправлен: Сентябрь 11, 2010, 01:43:54 »
А возможно сделать чтобы работало для обеих боковых кнопок(левая и правая)?

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

Re: MouseSetOnEvent - Обработка событии мышки
« Ответ #14 Отправлен: Сентябрь 11, 2010, 01:43:54 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
60 Ответов
29717 Просмотров
Последний ответ Июль 04, 2012, 15:50:30
от CreatoR
8 Ответов
8032 Просмотров
Последний ответ Сентябрь 01, 2016, 16:04:39
от werton
3 Ответов
7147 Просмотров
Последний ответ Июль 10, 2010, 17:54:08
от spider_xr
8 Ответов
3450 Просмотров
Последний ответ Апрель 05, 2012, 09:40:35
от madmasles
6 Ответов
2232 Просмотров
Последний ответ Март 16, 2014, 23:06:37
от madmasles
3 Ответов
2538 Просмотров
Последний ответ Март 27, 2014, 22:01:09
от AZJIO
9 Ответов
1735 Просмотров
Последний ответ Апрель 24, 2015, 17:23:51
от Крепыш
0 Ответов
829 Просмотров
Последний ответ Апрель 02, 2015, 16:13:06
от madmasles
15 Ответов
11450 Просмотров
Последний ответ Май 02, 2016, 02:36:31
от CreatoR
2 Ответов
769 Просмотров
Последний ответ Январь 10, 2016, 21:03:23
от Alofa