1 (изменено: Krot66, 2017-02-01 19:05:38)

Тема: AHK: Управление жестами мыши

Доработка "Lex' Mouse Gestures" отсюда.
В настоящий момент скрипт отрабатывает все виды жестов (движением курсора, жесты с колесиком и последовательным нажатием левой и правой кнопок мыши), а также жесты без нажатия клавиш, что позволяет его использовать и на устройствах без мыши как таковой. Скрипт прост в настройке жестов для различных приложений и их групп; позволяет так же настраивать жесты для сайтов и их горячих клавиш (жесты для почтовых ящиков, социальных сетей и т.д.), при этом незанятые жесты, закрепленные за приложением, останутся рабочими. Жесты могут использоваться для вызова команд меню, заполнения форм, перемещения объектов и некоторых других несвойственных для программ такого рода функций. Можно назначать жесты любого вида в зависимости от четверти или половины экрана, в которой он совершается.
Изменением локальных настроек скрипт может быть "подружен" практически с любым приложением.

Сначала о недостатках оригинального скрипта.
В его конфигурационные файлы вписываются метки вида "Gesture_D_R:", в которых последние буквы означают штрихи соответствующих направлений (L, R, D, U; к ним добавляются DR, DL, UR, UL при включении распознавания "косых" штрихов). К этим меткам переходит скрипт при совершении соответствующих жестов мышью. За ними следуют обычные аутохоткейные манипуляции, причем при большом числе используемых программ это длинные деревья с условными выражениями. Не видно что закреплено за конкретной программой, нет возможности сгрупировать относящиеся к ней настройки в одном месте.
Далее, нет возможности задания глобальных исключений. Например, программы типа FAR или Total Commander с включенным выделением правой кнопкой мыши не проглатывают посаженные на нее жесты. Cкрипт полностью блокирует жесты мыши в браузерах, имеющих их встроенную поддержку, т.е. надо либо выключать скрипт, либо настраивать те же манипуляции в нем.

Что сделано здесь.
1. В области автозапуска конфигурационного файла прописываются группы окон, требующих отдельного задания жестов; программы со сходным управлением попадают в одну группу. Помимо этого, автоматически создается группа Default, включающая все окна. При распознавании жеста скрипт ищет сначала метки, привязанные к группе текущего окна, если она определена, и уже в случае отсутствия их совершает действия, заданные группой Default.
Например, при конфигурационном файле

.............
GroupAdd Text, ahk_exe notepad.exe
return

Text_U_L:
Send ^{vk4F}
return

Default_U_L:
Send !{Up}
return

жест вверх-влево будет посылать клавиши Ctrl+O в блокноте и сочетание Alt+Up во всех прочих случаях.
Если окно состоит в нескольких группах, срабатывает первая, в которой будет найдена соответствующая метка.

2. Для задания глобальных исключений используется группа Exclude; в нее же прописываются браузеры с нативной поддержкой жестов мыши, если они используются. При этом исключения касаются только основной клавиши жестов, так что можно совершать жесты с зажатой не правой кнопкой мыши, а, например, средней или боковой. Более того, можно с одной стороны добавить программу в исключения, а сдругой добавить в группу, метки которой будут исполняться только с дополнительной клавишей.

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

.............
GroupAdd Text, ahk_exe notepad.exe
Text_U_L=^{vk4F}
Default_U_L=!{Up}
return

Для посылки клавиш командой SendEvent вместо стандартной SendInput следует добавить в начало строки клавиш "@".
Метки имеют приоритет перед одноименными переменными!

4. В скрипт добавлена возможность создавать метки и переменные, привязанные к области выполнения жестов (область определяется началом выполнения жеста). Экран поделен на четыре части с нумерацией от левого верхнего угла.
Соответственно
Default#3_U_L: - метка срабатывающая при выполнении жеста вверх-влево в нижней левой чтасти экрана;
Default#12_U_L: и Default#24_U_L: - метки срабатывающие в верхней и правой половинх экрана.
Допускается не более двух цифр, относящихся к смежным областям и поставленных в порядке возрастания. Использование  переменных аналогично вышеописанному. Скрипт сначала ищет метки и переменные с определением области (сначала с одной, а после двумя цифрами) и уже затем переходит к обычным.

5. Как и оригинале, имеется возможность задания жестов с колесиком, только теперь уже применительно к группе окон и региону. Используются переменные и метки вида Default_WheelUp и Default_WheelDown. Для привязки к региону они будут выглядеть как Default#..._WheelUp и Default#..._WheelDown. Удобство этого во многом зависит от качества трещетки мыши.

6. Добавлена возможность задания жестов последовательным нажатием левой и правой кнопок мыши (так называемые "rocker gestures"). Последним соответствуют метки и переменные вида Default_Forward и Default_Back. Их можно настроить для любых приложений с учетом групп окон и места на экране (в последнем случае они имеют вид Default#..._Forward и Default#..._Back). Если ничего не назначено, работоспособность встроенных браузерных жестов такого типа сохраняется в полной мере.

7. Добавлена возможность изменения вводной задержки для групп окон (когда нажимается и не отпускается клавиша жестов, скрипт ждет установленное время начало движения мыши или колеса, в отсутствии котрых посылает нажатие клавиши). В принципе большая задержка добавляет  удобства в выполнении жестов, особенно колесных (попробуйте нажать правую кнопку и прокрутить колесико за 200 мс - надо минимум 400-500), но одновременно задержка замедляет действия без отпускания клавиши, вроде перетаскивания или выделения.
Для определения задержки достаточно задать значение в милисекундах переменной с именем группы в области автозапуска конфигурационного файла.

8. Добавлена возможность отображения тултипа с распознанным действием, найденной меткой или переменной (в последнем случае выводятся и посылаемые клавиши) - видно как был интерпретирован жест и что было сделано. Отображается также время между нажатием клавиши и началом жеста и вводная задержка для данной группы окон, что позволяет откорректировать ее значения, а при необходимости и саму технику жестов. С настройками по умолчанию тултип отображается при включенном Scroll Lock, чем и рекомендуется пользоваться на стадии отладки.

9. Добавлена возможность автоматического возвращения курсора в исходную точку жеста. Это позволяет жестами мыши заполнять формы, вызывать пункты контекстного меню ссылок, перемещать объекты и пр.. Сделать это можно либо добавляя точку в начало значения переменных жестов, либо программно через возврат к координатам экрана start_x, start_y, либо прописав такое стандартное поведение в настройках.

10. Улучшена отработка "косых" жестов за счет задания времени остановки цикла распознавания жестов при значительном изменении направления движения мыши. Это уменьшает вероятность появления паразитных штрихов в поворотных точках.

11. Добавлена запретная зона для жестов по краям экрана для предотвращения конфликтов с другими программами (блокировка появления боковых окон и пр.).

12. Упрощена настройка жестов без нажатия клавиш. Пункт меню скрипта "Suspend" теперь останавливает отработку и безклавишных жестов.

13. Оставлен только один конфигурационный файл без файла "настроек по умолчанию" - здесь все наглядно умещается в одном.

В качестве суммы по разрешению трудностей.
1. Если программа активно использует правую кнопку (как Total Commander с выделением правой кнопкой мыши), можно добавить ее в группу Exclude, прописать в настройках дополнительную кнопку (лучше среднюю - боковые поневоле смещают мышь) и пользоваться ей, настроив действия обычным образом.
2. Если есть желание сохранить какие-то уникальные жесты браузера (меню вкладок при жесте колесиком или действие, не имеющее соответствующей горячей клавиши) и повесить свои на правую же кнопку, уменьшайте вводную задержку для данной группы, и тогда после соответствующей паузы будут работать оригинальные жесты. Если это критично, можно пользоваться почти любой программой с минимальной вводной задержкой, приучив себя нажимать клавишу уже при движении мыши.
3. Метки скрипта отрабатываются как подпрограммы внутреннего цикла скрипта; их зависание ведет к временной утрате работоспособности дополнительных кнопок мыши и самих жестов, восстанавливаемой перезапуском скрипта. Поэтому скрипт изначально не рассчитан на то, что в его конфигурационном файле будут прописываться какие-то продолжительные действия. Если это необходимо, запускайте по жесту другой скрипт или передавайте ему действие с помощью горячих клавиш. Следует так же следить за всевозможными ждущими конструкциями (ожидания окон, процессов и пр.) и всегда ставить в них ограничения по времени.

Некоторые рекомендации по настройкам есть в основном файле скрипта.
В конфигурационном файле есть ряд примеров с пояснениями.

Post's attachments

Gestures.zip 151.43 kb, 54 downloads since 2017-02-01 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Управление жестами мыши

Помнится была у нас уже такая тема. В общем и целом интересная и удобная штука для Windows-устройств с сенсорным экраном. Где-то слыхал про подобное на Android - там можно обучать программу, не влезая в файл настроек. В общем, если заморочиться, можно даже платный продукт состряпать.

3

Re: AHK: Управление жестами мыши

Я не пробовал это на сенсорном экране, поскольку его у меня нет. Но для меня это много удобнее Strokes и Strokes Plus - гораздо быстрее в настройках и куда больше возможностей.

4

Re: AHK: Управление жестами мыши

Лучшему нет предела, спасибо)) Интересует, можно ли без помех совместить основной код с этим кодом? —


#IfWinActive, ahk_class CabinetWClass
~LButton & RButton::
    Send, {Browser_Forward}  ; "вперед" (здесь есть тильда, поэтому левая мышь
                             ; не блокируется для других приложений)
RETURN
RButton & LButton::
    Send, {Browser_Back}     ; "назад" (здесь тильды нет, поэтому правая мышь блокируется)
RETURN
$RButton:: Send, {RButton}   ; нажимать RButton всегда, кроме тех случаев, когда она используется 
                             ; в горячих клавишах (здесь мы разблокируем правую мышь)
Return
#IfWinActive

5

Re: AHK: Управление жестами мыши

Пока что это можно сделать просто прописав вводную задержку для окон Эксплорера
Explorer = 200
или что-то вроде того. В принципе при привычке нажимать клавишу жестов в движении это не обременительно. Нужды же в {Browser_Forward} и {Browser_Back} сейчас нет никакой: и поголовно все браузеры и Эксплорер понимают Alt+Left и Alt+Rght. Можно просто использовать одноклавишные жесты Вперед и Назад, которые прописаны в конфигурационном файле.
Вообще этот вопрос кажется решаемым - попробую сделать.

+ DD

6 (изменено: Krot66, 2017-01-22 20:05:19)

Re: AHK: Управление жестами мыши

Архив обновлен. Сочетания RButton & LButton и LButton & RButton, как и браузерные жесты последовательным нажатием правой и левой кнопок мыши, теперь работают вне зависимости от настроек скрипта.

7

Re: AHK: Управление жестами мыши

Тестировал это дело — почему-то не отрабатывало. То есть, копировал код из четвертого поста в основной код из архива: кнопки в сочетании работали, но отдельно функционал правой — нет.

8 (изменено: Krot66, 2017-01-30 12:10:44)

Re: AHK: Управление жестами мыши

В одном скрипте это и не будет работать. Дело в том, что скрипт создает собственные горячие клавиши RButton, по которым отрабатываются жесты. Речь шла только о беспрепятственной отработке сторонних приложений и скриптов. Сейчас если нажата левая клавиша, хоткей для правой клавиши блокируется, а если нажата правая клавиша и произошло нажатие левой, будет транслировано это сочетание.
Как отдельный скрипт приведенный фрагмент работает исправно.

9

Re: AHK: Управление жестами мыши

А так тоже не идет: закрыл все AHK-скрипты, запустил эти оба, но срабатывает только Gestures.ahk, а при попытке сочетать кнопки мыши — вылазит меню))

10

Re: AHK: Управление жестами мыши

У вас последняя версия скрипта? У меня работает в Эксплорере идеально, причем с очень грубыми настройками скрипта. А если убрать #IfWinActive, это работет и в браузерах (кроме IE, но это особый случай). Да и у меня эти сочетания используются в ряде мест - тоже все нормально.

11

Re: AHK: Управление жестами мыши

С одним "но" в Эксплорере работает только один последний запущенный скрипт. С этим уже ничего не поделаешь - без
$RButton:: Send, {RButton}
отвалится правая клавиша.

12

Re: AHK: Управление жестами мыши

Да, запускаю последнюю версию скрипта — тем не менее, он во всех окнах ведет себя так же, как в Проводнике. Может, влияют какие-то настройки при установке AHK? Галочка какая-нибудь там?

13

Re: AHK: Управление жестами мыши

Нет. Подождите день-два - будет простое и универсальное решение.

+ DD

14

Re: AHK: Управление жестами мыши

Архив и описание обновлены. Самым простым способом разрешения всех противоречий оказалось сделать встроенную поддержку таких комбинаций клавиш. Так что теперь скрипт имеет поддержку всех видов жестов: движением, колесных и последовательным нажатием левой и правой кнопок мыши.

Последним соответствуют метки и переменные вида Default_Forward и Default_Back. Их можно настроить для любых приложений с учетом групп окон и места на экране (в последнем случае они имеют вид Default#..._Forward и Default#..._Back). При этом браузерные жесты такого типа продолжают работать, если, конечно, они не переопределены.

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

Explorer_Forward=!{Right}
Explorer_Back=!{Left}

Исправлено определение вводной задержки.

15 (изменено: DD, 2017-02-04 06:03:36)

Re: AHK: Управление жестами мыши

Вот спасибо. Только сразу выяснилось, что сочетание Правая Кнопка Мыши + Средняя КМ (причём, у меня различаются короткое и долгое нажатие) и сочетание Правая Кнопка Мыши + Колесо Мыши — перестали обрабатываться. Возможна ли и их настройка? Тогда, кажется, это сняло бы все проблемные ситуации с ПКМ.

16 (изменено: Krot66, 2017-02-04 13:08:56)

Re: AHK: Управление жестами мыши

Правую кнопку и колесо можно сделать только уменьшая вводную задержку для приложения или добавляя его в группу Exclude. Правую+среднюю в принципе можно сделать. Но зачем это вам? Я как раз занялся этим скриптом чтобы покончить с балетными и далеко не всегда как надо работающими комбинациями на пяти кнопках мыши.
Добавлено:
Жесты с колесиком входят в функционал скрипта. Просто привяжите имеющийся скрипт к соответствующим меткам.

+ DD

17 (изменено: nnpfbzus, 2022-07-28 10:55:10)

Re: AHK: Управление жестами мыши

Krot66,
А как настройки жестов (например DL=ctrl+w, U=ctrl+x) засунуть в ini, чтоб каждый раз не пересобирать скрипт?
Или например обработку наклона колеса
влево = ctrl+F4
вправо=2×ЛКМ
(а кому-то может наоборот надо)

CoordMode, Mouse, Screen
WheelLeft::send, !{f4}
WheelRight::
    MouseGetPos, mx, my
    MouseClick, Left, mx, my, 2
return

P.S. вопрос касается простого случая, когда жесты нужны как глобальные срабатывания вне зависимости от приложения.

18

Re: AHK: Управление жестами мыши

По идее

Default_D_L=^{vk57}
Default_U=^{vk58}

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

19

Re: AHK: Управление жестами мыши

Krot66
Насколько понимаю, в скрипте нет "зажать и наклонить". Есть просто наклон влево/вправо. Но основой вопрос был про ini: Как «научить» скрипт читать ini, в котором каждый уже пропишет наклон ли или с зажатой кнопкой.

akaX-Mouse.ahk


CoordMode, Mouse, Screen
WheelLeft::send, !{f4}
WheelRight::
    MouseGetPos, mx, my
    MouseClick, Left, mx, my, 2
return

А вот предположительный ini
akaX-Mouse.ini


[v]
; наклон колеса мыши влево WheelLeft – закрыть приложение Alt+F4
whL=WheelLeft::send, !{f4}
; наклон колеса мыши вправо WheelRight – двойной клик ТУТ 2 команды – разобраться как писать в одну строку
whR=WheelRight::MouseGetPos, mx, my MouseClick, Left, mx, my, 2
; зажать правую+клик левой – ВСТАВИТЬ
mcRL
; зажать левую+клик правой – КОПИРОВАТЬ
mcLR