захват правого клика+левый клик с автоотключением; неожиданное поведение
Я хочу захватить ключевое событие "нажата правая кнопка мыши, затем нажата левая кнопка мыши". Никаких проблем с автоотключением. Однако у меня возникли проблемы с тем, чтобы позволить правой клавише мыши работать в одиночку.
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 ответ:
Вот один, который поддерживает перетаскивание Правой Кнопкой Мыши!
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:
- другое окно активно
RButton
вниз отправляется- Firefox не активен, поэтому обрабатывается второй вариант
- (
RButton
удерживается, хотя задержка может быть незаметной, в порядка миллисекунд, до бесконечности)- Firefox становится активным
- (все еще удерживается)
RButton
отправляется up , который отправляетRButton
в соответствии с документацией. Поскольку Firefox стал активным в задержке между проверкой активного окна и отправкойRButton
,RButton
отправляется в Firefox.Это происходит, когда и Firefox, и другое окно видны, и другое окно является активным во время щелчка.
Я пытался исправить эта ошибка, добавив дополнительную проверку
IfWinNotActive
в горячую клавишуRButton
, но она, кажется, не работает.