В моём случае полный перехват ПКМ, поэтому контекстного меню нет.
Предназначено для управления Ютубом и 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