1 (изменено: leex, 2022-12-08 16:23:34)

Тема: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Добрый день.
Пытаюсь написать скрипт чтобы назначить программное сочетание клавиш Alt+RMB на нажатие и удерживание RMB, но без успеха, так как не хватает знаний.
Короткий клик RMB я бы хотел оставить без изменений (скрипт не должен реагировать на короткий клик) так как коротким кликом вызывается контекстное меню внутри программы.
За основу взял этот скрипт:

#IfWinActive ahk_exe Photoshop.exe
    MButton::
    Send {Space Down}{LButton Down}
    Keywait, MButton
    Send {LButton Up}{Space Up}
    Return
#IfWinActive


Вот мой код:

#IfWinActive ahk_exe CINEMA 4D.exe
    RButton::
    Send {RButton Down}{ALT}
    Keywait, RButton
    Send {RButton Up}{ALT}
    Return
#IfWinActive

2

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Вот так вроде работает, но короткий клик ПКМ не вызывает теперь контекстное меню.
И скрипт этот распространил свое влияние на все программы, включая интернет браузер.

#IfWinActive ahk_exe CINEMA 4D.exe
    RButton::
    Send {RButton}{ALT}
    Keywait, RButton
    Send {ALT Down}{RButton Up}
    Return
#IfWinActive

3

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Вот пример для блокнота:

#IfWinActive ahk_exe Notepad.exe

!RButton::
Keywait, Alt
Keywait, RButton
Send 1
Return

#If
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Есть встроенная переменная A_TickСount, её значение постоянно возрастает. Можно использовать, чтобы отличить "короткий" клик от "длинного".

5 (изменено: leex, 2022-12-09 19:14:13)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Вот так вроде работает без влияния на другие программы, но короткий клик ПКМ не вызывает теперь контекстное меню.
Думаю, наверное где-то тут должен стоять атрибут времени. Скрипт должен срабатывать с задержкой при удерживании нажатом состоянии ПКМ, например через 0.2 сек. Думаю, что тогда контекстное меню будет открываться при коротком клике ПКМ.

Есть идеи?

#IfWinActive ahk_exe CINEMA 4D.exe
    RButton::
    Send {ALT Down}{RButton Down}
    Keywait, RButton
    Send {ALT Up}{RButton Up}
    Return
#IfWinActive

6

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

__Михаил__ пишет:

Вот пример для блокнота:

Не работает.

ypppu пишет:

Есть встроенная переменная A_TickСount

А как ей пользоваться?  Я полный дилетант в этом деле.

7

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

__Михаил__ пишет:
!RButton::

Я так понял, что должно запускаться не по Alt + RButton, а просто по RButton.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

teadrinker пишет:

Я так понял, что должно запускаться не по Alt + RButton, а просто по RButton.

В CINEMA 4D Сочетание Alt + RButton вызывает вращение камеры.
В скрипте на RButton я хочу назначить эти комбинации клавиш, но вызывать длинным кликом.

9

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Попробуйте так:

#IfWinActive ahk_exe CINEMA 4D.exe
    RButton::
    KeyWait, RButton, T.3 ; .3 это 300 ms
    if !ErrorLevel
        Send {RButton}
    else {
        Send {ALT Down}{RButton Down}
        Keywait, RButton
        Send {ALT Up}{RButton Up}
    }
    Return
#IfWinActive
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: leex, 2022-12-06 19:54:28)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

teadrinker
Круто!
Очень признателен!!
Только оказалось, что задержка долговата и на 100 мс.
Хочу уменьшить до 10 или до 0.5.

Изменил значение до T0.1 ; 0.1 это 10 ms?
0.05 это 5 ms?
Верно?

11

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

leex пишет:

Изменил значение до T0.1 ; 0.1 это 10 ms?

Нет, если 0.1 это 10 ms, то как тогда 100 ms?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: leex, 2022-12-06 20:32:56)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

teadrinker пишет:

Нет, если 0.1 это 10 ms, то как тогда 100 ms?

Я понял. Перед точкой в T.3 идет "не записанный" ноль.
Верно?

Я вот  так сейчас изменил.

T0.088 ; 0.088 это 88 ms

Нашел "золотую середину" и контекст успевает сработать на короткий клик и длинный клик не особо тормозит при начале выполнения.

13

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

leex пишет:

А как ей пользоваться?

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

leex пишет:

скрипт не должен реагировать на короткий клик

Я так понимаю, длинный клик - это когда кнопка была долго нажата, а затем отпущена. Замерять длину клика как раз можно при помощи A_TickСount. Сначала засекаете метку времени в момент нажатия кнопки, затем засекаете в момент отпускания. Из второго вычитаем первое - получаем время удержания кнопки. Если это время превышает определённый порог, клик будет считаться длинным, в противном случае - коротким.

14 (изменено: leex, 2022-12-06 21:13:16)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

ypppu пишет:

Я так понимаю, длинный клик - это когда кнопка была долго нажата, а затем отпущена.

Верно, но момент отпускания не фиксирован по времени. Я удерживаю кнопку пока вращаю камеру. Отпустить могу в любой момент. И в этот момент скрипт должен перестать выполняться.
Методом проб и ошибок я нашел время 88 ms когда должен срабатывать скрипт от teadrinker (88 ms с момента нажатия и удержания ПКМ).

Ваш метод с замером времени очень интересен. Можно ли показать на примере, как замерять короткий и длинный клик в CINEMA 4D если вам не будет трудно.


Хотя наверное я заблуждаюсь. Длинного клика в Синиме нет. Там идет комбинация клавиш.
Длинный клик это мы сейчас в этой теме сами придумали. Короткий остался по умолчанию "на контекст", а созданный нами длинный — на команду "Вращение".

15

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

leex пишет:

Верно, но момент отпускания не фиксирован по времени.

В каком смысле "не фиксирован"? Вы можете в скрипте создать горячую клавишу RButton UP::. Таким образом, при каждом отпускании правой кнопки мышки скрипт будет выполнять подпрограмму, которую Вы укажите. Более подробно механизм вычисления времени удержания кнопки я описал в предыдущем посте.

Описание A_TickCount и практические примеры описаны в статье Переменные и выражения / Встроенные переменные: даты и времена.

16 (изменено: leex, 2022-12-06 21:30:17)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Да сейчас вроде все отлично. Комфорт. Вопрос решен. Всем спасибо!

Но хотел бы еще поинтересоваться по поводу автоматического запуска в момент старта программы для которой этот скрипт предназначен. 
Для запуска скрипта (из первого поста), который меняет назначение клавиш в Фотошопе я использую планировщик заданий.
Скрипт упаковал в .ехе чтобы управлять процессами.
1. Запуск скрипта (.ехе)  при определенных условиях. В моем случае — старт Photoshop.
2. Выключение скрипта при закрытии Photoshop. Срабатывает батник на событие, упакованный в .ехе Kill_Proces.

Вопрос, единственный ли это путь для запуска и закрытие скрипта для определенной программы?

17 (изменено: ypppu, 2022-12-06 21:43:39)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

В AutoHotkey такая штука уже предусмотрена. Выше я говорил про обычные горячие клавиши - они работают при любых обстоятельствах. Но при помощи специальных директив можно заставить их работать при определённых условиях. Напрмер:
#IfWinExist - гор. клавиша будет работать только пока существует определённое окно (в Вашем случае -  Photoshop).
#IfWinActive - гор. клавиша будет работать только когда определённое окно активно. В другом окне гор. клавиша не будет функционировать.
В общем от пользователя нужно только запустить скрипт, дальше скрипт уже сам разберётся, когда следует задействовать гор. клавиши.

18

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

ypppu
Чтоб автоматизировать и забыть можно настроить автозапуск при старте компа.
Но тогда процессы всегда будут висеть в системе. Я не сторонник.

19

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

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

20 (изменено: leex, 2022-12-08 02:33:58)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

ypppu пишет:

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

Если все так, как вы говорите, то наверное озадачиваться сложным путем (планировщики, события, мониторинг процессов, батники и упаковка в исполняемый) не имеет смысла.

21 (изменено: leex, 2022-12-09 19:15:41)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Я только сейчас понял, что вы имели ввиду про фиксированное во времени отжатие, и запуск, например подпрограмм.
По умолчанию короткий клик на вызов контекстного меню работает  так:
Нажал и тут же (в течении примерно 1 секунды) отжал. Контекстное меню вызывается именно в момент быстрого отжатия RButton UP, а не нажатие на RMB.
Эти миллисекунды c момента нажатия до момента RButton UP и есть наш условный "короткий клик".

Наш скрипт все-таки работает с изъяном, несмотря на то, что я как бы "нашел золотую середину" в 88 ms.
Тестирую в работе и вижу, что часто идет путаница. То контекст не успевает сработать за 88 ms, то команда "Rotate" вызывается со значительной задержкой если изменить 88 ms на более длительный временной интервал.
Не найти тут "золотую середину" — можно лишь чтобы четко работал только "контекст", но с задержкой вызова команды  "Rotate". Либо мгновенный "Rotate" если оставить 88 ms или меньше, но тогда не будет правильно работать вызов "контекстного меню".

Вот какие мысли посетили меня чтобы улучшить алгоритм: 
Если нажали ПКМ и еще не успели отпустить кнопку в течении 88 ms или около того, то тут  должен  вызываться "Rotate" (вызывается "ротейт" почти мгновенно — в минимальном временном интервале, (потом можно будет настроить миллисекунды)), но если отпустили в течении, например 1 секунды или больше, то "ротейт" должен перестать работать, чтобы дать возможность сработать команде по умолчанию "Контекст". А если отжатие за 1 секунду (или больше) не произошло, то продолжает работать "ротейт" до любого во времени момента отжатия ПКМ.
Можно ли попросить перевести этот алгоритм на язык программирования?

"Rotate" это наш  {ALT}{RButton} до момента отжатия ПКМ.
"Контекст" — скрипт отдает приоритет программным командам по умолчанию при отжатии ПКМ (короткий клик в ms).

22

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Вроде так:

#IfWinActive ahk_exe CINEMA 4D.exe
    RButton::
    KeyWait, RButton, T.09 ; .09 это 90 ms
    if !ErrorLevel
        Send {RButton}
    else {
        Send {Alt Down}{RButton Down}
        KeyWait, RButton, T1
        if !ErrorLevel
            Send {Alt Up}{RButton Up}{RButton}
        else {
            Keywait, RButton
            Send {Alt Up}{RButton Up}
        }
    }
    Return
#IfWinActive
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23 (изменено: leex, 2022-12-09 19:16:10)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Благодарю, teadrinker!

Тестирую скрипт.
Отпишусь.

24 (изменено: leex, 2022-12-08 05:02:12)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Применял разные временные интервалы, но путаница все же присутствует.
Вообще, когда моделишь в Синьке, да и в других 3d пакетах, часто бывает так, что надо чуток шевельнуть камеру (Ротейт) буквально на долю секунды. Наш скрипт имеет проблему: Шевельнул чуток, отжал кнопку и тут же контекст. Так быть не должно.

Я понял сейчас, что проблему не решить в рамках этого скрипта, так как моя идея с временными интервалами оказалась в корне не верная. Исходя из тестов пришло понимание того, что правильнее будет оперировать не условиями привязанным ко времени, а условием подвижности/неподвижности курсора.
Ведь когда зажата комбинация клавиш и в этот момент движется курсор, то понятное дело — пользователь желает либо вертеть, либо масштабировать сцену. Скрипт должен стартовать только при движущемся курсоре. А при неподвижном курсоре + ПКМ будет стартовать дефолтное «контекстное меню».

В общем думаю, что алгоритм должен быть таков:
Если курсор движется и в этот момент зажимается ПКМ то
RButton
{Alt Down}{RButton Down}
Если курсор в какой-то момент остановился, то скрипт продолжает выполняться.
Выполняется вплоть до момента отжатия ПКМ.

25

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

Я бы платно взялся.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

teadrinker
Цена вопроса?
Можно в личку.

27

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

В чат написал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: leex, 2022-12-08 12:12:10)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

leex пишет:

В общем думаю, что алгоритм должен быть таков:
Если курсор движется и в этот момент зажимается ПКМ то
RButton
{Alt Down}{RButton Down}
Если курсор в какой-то момент остановился, то скрипт продолжает выполняться.
Выполняется вплоть до момента отжатия ПКМ.

Дополню:

Бывает так, что сначала зажал ПКМ а потом начинаешь водить курсор. Тут должен вызываться «ротейт». Значит скрипт должен срабатывать и при неподвижном курсоре.
Но чтобы срабатывало штатное «контекстное меню» надо в скрипте указать, что «контекст» может сработать на отжатие ПКМ только в течении 1 секунды и только если курсор не двигался в теч этой секунды. То есть если курсор успел подвигаться с момента начала работы скрипта, то вызов штатного «контекстного меню» в момент отжатия ПКМ игнорируется.



Дополнено

leex пишет:

Значит скрипт должен срабатывать и при неподвижном курсоре.

А лучше, наверное в момент начала сдвигания. Тогда мы отсечем лишние инструкции на вызов штатного «контекста» (условия с долями секунды).

Точно! Если двигаем при зажатой ПКМ, то скрипт начинает работу. Не двигаем если, то и скрипт не срабатывает. Отжали ПКМ после двиганья — скрипт перестал работать не вызывая штатное «контекстное меню». Отжали ПКМ при условии что двиганья не происходило — значит и скрипт не срабатывал, значит будет вызываться штатный «Контекст».

29 (изменено: leex, 2022-12-09 19:16:51)

Re: AHK: Как назначить сочетание клавиш Alt+RMB на RMB

teadrinker
Огромное, человеческое Благодарю!!
Спасибо за Вашу работу.
Скрипт супер! Работает без нареканий как швейцарские часики.