захват правого клика+левый клик с автоотключением; неожиданное поведение


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

1) это работает:

RButton & LButton::
    Send X
Return

Работает, как и ожидалось:

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

2) это работает

~RButton & LButton::
    Send Y
Return

Работает как ожидалось:

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

3) Теперь я хочу делать разные вещи. в зависимости от активного окна.

Это не работает (осторожно: это отключит righ-click в каждом приложении)

#If WinActive("ahk_class MozillaWindowClass")

RButton & LButton::
    Send X
Return


#If !WinActive("ahk_class MozillaWindowClass")
~RButton & LButton::
    Send Y
Return

Работает не так, как ожидалось:

  • В Firefox слева направо посылает X, в других приложениях слева направо посылает Y
  • однако щелчок правой кнопкой мыши отключен в каждом приложении

Что я здесь делаю не так?


Правка:

Цель такова: я хочу глобальную горячую клавишу на правой+левой кнопке с RButton & LButton . В определенных приложениях, которые я проверил на совместимость, я хочу, чтобы правый + левый щелчок подавлял отправку правого щелчка, а затем отправлял правый щелчок вручную с помощью autohotkey. Тем не менее, поскольку некоторые приложения могут иметь проблемы с обработкой mouseevents, отправленных autohotkey, во всех непроверенных приложениях я хочу использовать ~RButton & LButton С ~ для передачи событий правой кнопки мыши

1 3

1 ответ:

Вот один, который поддерживает перетаскивание Правой Кнопкой Мыши!

Hotkey, LButton, off

#IfWinActive ahk_class MozillaWindowClass
RButton & LButton::
    Send X
Return

RButton::return

#IfWinNotActive ahk_class MozillaWindowClass
~$RButton::
Hotkey, LButton, on
while GetKeyState("RButton", "P") {
    continue
    }
Hotkey, LButton, off
Return

LButton::Send Y
Return

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

LButton отключается в начале строкой вверху.

Другим способом было бы отправить {RButton Down} в начале горячей клавиши и {RButton Up} в конце.

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

Ошибка с активным окном, описанная в нижней части этого ответа, все еще существует, но это проблема с #IfWin[Not]Active.

Старые вещи

См. документация по амперсанду (Курсив мой):

Пользовательскую комбинацию двух клавиш (кроме кнопок джойстика) можно задать с помощью символа " & " между ними. В приведенном ниже примере вы удерживаете нажатой клавишу Numpad0, а затем нажимаете вторую клавишу, чтобы вызвать горячую клавишу:

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

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

Numpad0::WinMaximize A   ; Maximize the active/foreground window.
Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a Numpad0 keystroke. See comment below.

Наличие одной из указанных выше горячих клавиш заставляет отпустить Numpad0 для выполнения указанного действия, но только в том случае, если вы не нажимали никаких других клавиш, пока Numpad0 удерживался.

Итак, следуя этому примеру:

#If WinActive("ahk_class MozillaWindowClass")

RButton & LButton::
    Send X
Return

RButton::return

#If !WinActive("ahk_class MozillaWindowClass")
RButton & LButton::
    Send Y
Return

RButton::Send {RButton}

Примечание RButton требуется вариант, который ничего не делает в WinActive, по крайней мере с моим тестированием (см. ниже): RButton::return


Так как я использую Autohotkey стандартный, не Autohotkey_L, у меня нет #If и выше был непроверен. Следующий Я сделал тест, и он работает.

#IfWinActive ahk_class MozillaWindowClass
RButton & LButton::
    Send X
Return

RButton::return


#IfWinNotActive ahk_class MozillaWindowClass
RButton & LButton::
    Send Y
Return

RButton::Send {RButton}

Интересная ошибка, которую я заметил, это второй (неактивный) вариант, который иногда применяется к Firefox:

  1. другое окно активно
  2. RButton вниз отправляется
  3. Firefox не активен, поэтому обрабатывается второй вариант
  4. (RButton удерживается, хотя задержка может быть незаметной, в порядка миллисекунд, до бесконечности)
  5. Firefox становится активным
  6. (все еще удерживается)
  7. RButton отправляется up , который отправляет RButton в соответствии с документацией. Поскольку Firefox стал активным в задержке между проверкой активного окна и отправкой RButton, RButton отправляется в Firefox.

Это происходит, когда и Firefox, и другое окно видны, и другое окно является активным во время щелчка.

Я пытался исправить эта ошибка, добавив дополнительную проверку IfWinNotActive в горячую клавишу RButton, но она, кажется, не работает.