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