1 (изменено: Drebin893, 2025-06-24 13:49:10)

Тема: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

Здравствуйте, помогите доработать скрипт, или возможно есть другой аналог нужного действия.

Нужно сделать так, чтобы этот скрипт работал только если зажата правая кнопка мыши!
То есть, когда я зажимаю и держу правую кнопку мыши, а потом когда мне нужно, я нажимаю и держу левую кнопку мыши, и начинаются "спам" ЛКМ допустим каждые 100 миллисекунд, пока не отпущу ЛКМ или ПКМ. Если правая кнопка мыши не зажата, то скрипт не должен работать и влиять на нажатия ЛКМ.
Дополню для лучшего понимания.
В примере кода скрип включается на F1 и выключается при повторном нажатии на F1.
Нужно включение сделать пока зажата ПКМ, а выключение когда отпускаю ПКМ.
Для удобства конечно можно дописать чтобы это работало только в конкретном приложении.

; Вкл/выкл – F1
; Использование – просто зажми левую кнопку мыши

#noenv
#usehook
#singleinstance force
Hotkey, *~$LButton, Off

*~$LButton::
Loop
{
GetKeyState, LButtonState, LButton, P
If LButtonState = U
break
click
}
return

F1::
Hotkey, *~$LButton, Toggle
Soundplay, *120
return

2

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

Не советовал бы использовать правую кнопку мыши подобным образом. Когда вы её отпустите, появится контекстное меню объекта, над которым была мышь.

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

3

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

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

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

4

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

Ну, это смотря как использовать. Напишите свой вариант, может подойдёт.

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

5

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

В моём случае полный перехват ПКМ, поэтому контекстного меню нет.
Предназначено для управления Ютубом и MPC плеером в полном экране. Клавиши правда нужно настроить под ускорение / Замедление / Сброс.

WindowActions := {}	; Словари действий для разных окон (Грок v3 20-22.06.2025).
; Действия для MPC-BE:
WindowActions["ahk_class MPC-BE ahk_exe mpc-be64.exe"] := {"Up":"PgUp", "Down":"PgDn", "Left":"Left", "Right":"Right", "WheelDown":"sc4A", "WheelUp":"vk6B", "MButton":"NumpadMult"}
; Действия для YouTube (браузер, например Chrome):
WindowActions["ahk_class Chrome_WidgetWin_1 ahk_exe chrome.exe"] := {"Up":"z", "Down":"sc4A", "Left":"j", "Right":"l", "WheelDown":"Volume_Down", "WheelUp":"Volume_Up", "MButton":"NumpadMult"}

; Переменные для хранения координат
Global StartX := 0, StartY := 0, OtherButtonPressed := 0
Return

; Функция проверки, является ли окно поддерживаемым:
IsSupportedWindow(){
 Global WindowActions
 WinGet, ActiveWindow, ProcessName, A
 WinGetClass, ActiveClass, A
 ActiveWindowID := "ahk_class " ActiveClass " ahk_exe " ActiveWindow
 Return WindowActions.HasKey(ActiveWindowID)
}

; Функция для определения направления:
GetDirection(StartX, StartY, EndX, EndY){
 Static Threshold := 50	; Порог для определения движения (в пикселях).
 DeltaX := EndX - StartX, DeltaY := EndY - StartY, AbsX := Abs(DeltaX), AbsY := Abs(DeltaY)
 If (AbsX < Threshold && AbsY < Threshold)
  Return ""	; Недостаточное движение.
 If (AbsX > AbsY){
  If (DeltaX > 0)
   Return "Right"
  Else
   Return "Left"
 } Else {
  If (DeltaY > 0)
   Return "Down"
  Else
   Return "Up"
 }
}

; Функция для выполнения действия жеста:
ExecuteAction(WindowID, Gesture){
 Global WindowActions
 If (WindowActions.HasKey(WindowID)){
  Actions := WindowActions[WindowID]
  If (Actions.HasKey(Gesture)){
   SelectedKey := Actions[Gesture]
   Send, {%SelectedKey% Down}
   Sleep, 50
   Send, {%SelectedKey% Up}
  }
 }
}

; Горячие клавиши только для поддерживаемых окон +в полноэкранном окне:
#If IsSupportedWindow() And Get_Full()

RButton::
 OtherButtonPressed := 0
 MouseGetPos, StartX, StartY
 KeyWait, RButton
 If (OtherButtonPressed = 1)	; Если было нажатие др. клавиш - выход.
  Return
 MouseGetPos, EndX, EndY
 Direction := GetDirection(StartX, StartY, EndX, EndY)
 If (Direction){
  WinGet, ActiveWindow, ProcessName, A
  WinGetClass, ActiveClass, A
  ActiveWindowID := "ahk_class " ActiveClass " ahk_exe " ActiveWindow
  ExecuteAction(ActiveWindowID, Direction)
 }
 Else
  Send, {vk2}	; Обычное нажатие ПКМ.
Return

; Горячие клавиши для колёсика и средней кнопки только при зажатом ПКМ и в поддерживаемых окнах:
#If IsSupportedWindow() && GetKeyState("RButton", "P")

$WheelUp::	; Сокращение для 3 клавиш.
$WheelDown::
$MButton::
OtherButtonPressed := 1, Key := SubStr(A_ThisHotkey, 2)
WinGet, ActiveWindow, ProcessName, A
WinGetClass, ActiveClass, A
ActiveWindowID := "ahk_class " ActiveClass " ahk_exe " ActiveWindow, ExecuteAction(ActiveWindowID, Key)
KeyWait, % A_ThisHotkey, U
Return

#If

Get_Full(){	;00:13 08.02.2021	Определение полноэкранности окна:
 WinGetPos,,,W, H, A
 Mon := A_ScreenWidth + A_ScreenHeight	; Размеры экрана (основного).
 If (W+H >= Mon)	; Если равно экрану или больше его:
  Return 1
 Return 0
}

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

6

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

Так можно только в случае, если активно определённое приложение, и правая кнопка в нём совсем не нужна. Мне показалось, что ТС хочет, чтобы правая кнопка выступала в качестве модификатора. При этом вряд ли его устроит, чтобы она полностью потеряла функциональность. Мне пока не удавалось добиться такого без сайд-эффектов.

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

7 (изменено: RacalCucumber, 2025-07-25 07:19:18)

Re: AHK: Активация кода зажатием ПКМ и выключение отпусканием ПКМ

Drebin893 пишет:

Нужно сделать так, чтобы этот скрипт работал только если зажата правая кнопка мыши!
То есть, когда я зажимаю и держу правую кнопку мыши, а потом когда мне нужно, я нажимаю и держу левую кнопку мыши, и начинаются "спам" ЛКМ допустим каждые 100 миллисекунд, пока не отпущу ЛКМ или ПКМ.

Будет лучше, если вы напишете для чего именно вам нужен этот скрипт. По описанию он очень похож на обычную автотапалку для шутеров (стрельба очередью из неавтоматического оружия). Я угадал? Просто есть ряд специфических нюансов, которые нужно учитывать именно для автотапалки. Без которых она работать будет довольно условно. Или пользоваться ей будет не очень что бы удобно.