Мультимедиа кнопки клавиатуры как "глобальный" хоткей

D-Forest

Well-Known Member
23 Ноя 2013
362
261
63
Курск
Повозившись изрядно с программой AutoHotKey сумел таки сделать скрипт который биндит на 18 мультимедиа кнопок встречающихся на клавиатурах всякие дикие сочетания клавиш (чтоб по возможности избежать пересечений с чьим-то конфигом).


С запущеной програмкой мультимедиа кнопки в окне привязки клавиш рипера будут выглядеть не как, скажем, "Browser_Home" а как "Alt+Contrl+Shift+p" и соответственно работать на любых активных окнах (плагинов, миди-эдитора и т.п.)

Удобно забиндить кнопку "соло выбранного трека", например.

скачать exe файл (512кб) - d-forest.su/Reaper_Multimedia_Hotkey.zip


текст AutoHotkey скрипта
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.



Browser_Back::SendEvent !^+{p}
Browser_Forward::SendEvent !^+{o}
Browser_Refresh::SendEvent !^+{i}
Browser_Stop::SendEvent !^+{u}
Browser_Search::SendEvent !^+{j}
Browser_Favorites::SendEvent !^+{k}
Browser_Home::SendEvent !^+{l}
Volume_Mute::SendEvent !^+{m}
Volume_Down::SendEvent !^+{n}
Volume_Up::SendEvent !^+{b}
Media_Next::SendEvent !^+{h}
Media_Prev::SendEvent !^+{g}
Media_Stop::SendEvent !^+{[}
Media_Play_Pause::SendEvent !^+{]}
Launch_Mail::SendEvent !^+{'}
Launch_Media::SendEvent !^+{;}
Launch_App1::SendEvent !^+{/}
Launch_App2::SendEvent !^+{.}
 
  • Like
Реакции: variator и lil-burn
Добавил - 2й набор глобальных горячих клавиш с F1 по F12 который включается/выключается по нажатию ScrollLock

Если скроллок горит - нажатие на F1 например посылает Ctrl+Alt+Shift+F1 активируя то действие которое привязано на этот хоткей в рипере. Нажимаем скроллок, лампочка гаснет, - F1 снова становится F1 активируя то что привязано в рипере на F1.

d-forest.su/Reaper_Multimedia_Hotkey.zip

текст AutoHotkey скрипта
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.





A = 1

SetScrollLockState on


ScrollLock::
{
if A = 1
{

A:=0
SetScrollLockState off

Return
}
else
{

A:=1
SetScrollLockState on
Return
}
}




*F1::
{
if A = 1
{
SendEvent !^+{F1}
return
}
else
{
SendEvent {F1}
return

}
}

*F2::
{
if A = 1
{
SendEvent !^+{F2}
return
}
else
{
SendEvent {F2}
return

}
}


*F3::
{
if A = 1
{
SendEvent !^+{F3}
return
}
else
{
SendEvent {F3}
return

}
}

*F4::
{
if A = 1
{
SendEvent !^+{F4}
return
}
else
{
SendEvent {F4}
return

}
}

*F5::
{
if A = 1
{
SendEvent !^+{F5}
return
}
else
{
SendEvent {F5}
return

}
}

*F6::
{
if A = 1
{
SendEvent !^+{F6}
return
}
else
{
SendEvent {F6}
return

}
}


*F7::
{
if A = 1
{
SendEvent !^+{F7}
return
}
else
{
SendEvent {F7}
return

}
}


*F8::
{
if A = 1
{
SendEvent !^+{F8}
return
}
else
{
SendEvent {F8}
return

}
}


*F9::
{
if A = 1
{
SendEvent !^+{F9}
return
}
else
{
SendEvent {F9}
return

}
}


*F10::
{
if A = 1
{
SendEvent !^+{F10}
return
}
else
{
SendEvent {F10}
return

}
}


*F11::
{
if A = 1
{
SendEvent !^+{F11}
return
}
else
{
SendEvent {F11}
return

}
}


*F12::
{
if A = 1
{
SendEvent !^+{F12}
return
}
else
{
SendEvent {F12}
return

}
}


Browser_Back::SendEvent !^+{p}
Browser_Forward::SendEvent !^+{o}
Browser_Refresh::SendEvent !^+{i}
Browser_Stop::SendEvent !^+{u}
Browser_Search::SendEvent !^+{j}
Browser_Favorites::SendEvent !^+{k}
Browser_Home::SendEvent !^+{l}
Volume_Mute::SendEvent !^+{m}
Volume_Down::SendEvent !^+{n}
Volume_Up::SendEvent !^+{b}
Media_Next::SendEvent !^+{h}
Media_Prev::SendEvent !^+{g}
Media_Stop::SendEvent !^+{[}
Media_Play_Pause::SendEvent !^+{]}
Launch_Mail::SendEvent !^+{'}
Launch_Media::SendEvent !^+{;}
Launch_App1::SendEvent !^+{/}
Launch_App2::SendEvent !^+{.}

В принципе, если повозиться можно все кнопки клавиатуры сделать с двойным глобальным назначением. Останется только подписать их на самой клавиатуре и забиндить в рипере (или в любой другой DAW или в фотошопе например) чтобы получить быстрый доступ ко всему на свете
 
Итак, на сочетания Alt+Ctrl (и изредка Alt+Shift) забиндены все кнопки кроме Control, Shift, Win, Alt, CapsLock, Numlock, PrtScr, Pause, включая мультимедиа кнопки и кнопки доп клавиатуры с включенным и выключенным NumLock раздельно.

Scroll Lock активирует/деактивирует 2 слой клавиатуры. Ярлычок в трее также показывает 2 состояния - "S" - обычная клавиатура "H" - слой горячих клавиш.

d-forest.su/Global_Hotkeys.zip
 
@D-Forest,
Здравствуйте! У меня такой вопрос: будут ли работать ваши хоткеи, если рипер запущен, но окно его не активно?
Если таки да, был бы признателен за скрипт на всего одну клавишу\команду:
Caps Lock - (Reaper) Actions\Track: Toggle mute for track 01
Просто чукча НЕ скриптописатель, чукча - скрипточитатель :)
ПисАл об этом в другой теме, у меня таким образом организован talkback. Плохо лишь то, что приходится во время записи щёлкать мышкой по окну другой программы и получается путаница с лампочкой Caps Lock-а. Одним словом мне нужно чтоб Caps Lock включал\выключал Toggle mute for track 01 не зависимо от того активно окно рипера или нет.
 
@D-Forest,
Одним словом мне нужно чтоб Caps Lock включал\выключал Toggle mute for track 01 не зависимо от того активно окно рипера или нет.

Здравствуйте, я попробовал на скорую руку привязать на капслок сочетание клавиш "Ctrl+Alt+Shift+J" а на это сочетание уже привязать в рипере Toggle mute for track 01 и получилась ситуация что вроде оно работает, но только при активном окне рипера, т.к. когда активно окно другого приложения горячие клавиши в любом виде (скриптом или без скрипта) перехватываются активным приложением и в рипер не доходят.

Гарантировано читаются при свернутом рипере или при активном любом другом приложении только команды привязанные к миди событиям типа "Midi Chan 16 CC 29", то есть вам можно привязать событие "Toggle mute for track 01" на любую кнопку миди контроллера (даже, например, на клавишу "До 1 октавы" миди клавиатуры) и переключать ей. Световой индикации состояния при этом конечно не будет.
 
@D-Forest,
Спасибо за участие!
я попробовал на скорую руку привязать на капслок сочетание клавиш "Ctrl+Alt+Shift+J" а на это сочетание уже привязать в рипере Toggle mute for track 01 и получилась ситуация что вроде оно работает, но только при активном окне рипера, т.к. когда активно окно другого приложения горячие клавиши в любом виде (скриптом или без скрипта) перехватываются активным приложением и в рипер не доходят.

Гарантировано читаются при свернутом рипере или при активном любом другом приложении только команды привязанные к миди событиям типа "Midi Chan 16 CC 29", то есть вам можно привязать событие "Toggle mute for track 01" на любую кнопку миди контроллера (даже, например, на клавишу "До 1 октавы" миди клавиатуры) и переключать ей. Световой индикации состояния при этом конечно не будет.
Я уже написАл в другой теме (решил, что свою тему вы больше не отслеживаете). Чтоб не повторяться:
http://rmmedia.ru/threads/118229/page-66#post-2105614
Если в двух словах - получилось всё как хочу, кроме одного - при запуске моего скрипта индикация капслок блокируется - остаётся в том статусе, в каком была во время запуска скрипта. НО во всём остальном скрипт работает.
PS Да! Midi контроллера на работе нет (ни-ка-ко-го...)
 
Последнее редактирование:


Можете попробовать вставить это в начало вашего кода, он "принудительно" переключает значение капслок при нажатии на него. Если включение/выключение индикатора будет не в той фазе поменяйте SetCapsLockState on и off местами.

Код:
A = 1

SetCapsLockState on


CapsLock::
{
if A = 1
{

A:=0
SetCapsLockState off

Return
}
else
{

A:=1
SetCapsLockState on
Return
}
}
 
Вставил. Вот что получилось
Код:
A = 1

SetCapsLockState on


CapsLock::
{
if A = 1
{

A:=0
SetCapsLockState off

Return
}
else
{

A:=1
SetCapsLockState on
Return
}
}
;CapsLock::  отключил т.к. ошибка получается - повторение хоткея
IfWinNotExist ahk_class REAPERwnd
return
; Otherwise, the above has set the "last found" window for use below.
ControlSend, ahk_parent, {CapsLock}
return

Я правильно вставил?
Теперь лампочка переключается, НО мют в рипере вкл\выкл лишь когда его (рипера) окно активно. А при не активном окне мют не вкл\выкл (рипер не получает команду).
Может поправите? А то я что-то зашёл в тупик...
 
@Слава, я не знаю синтаксиса автохоткей настолько чтоб вам помочь. Проблема явно решаема, но мне ее решить за полчаса не удалось а копать глубже нет интереса.

Сама идея работы в таком формате немного ущербна потому что "mute" на треке можно нажать мышкой и индикатор капслока на него естественно не среагирует перейдя в обратное отображение (горит когда mute on и выключен когда mute off). То есть 1 раз забывшись и нажав mute мышкой получаем неверную индикацию.

Лучше уж копать в сторону USB миди контроллеров, где можно настроить стабильную работу, оставив этот уровень (операционной системы и компьютерной клавиатуры).
 
Спасибо!
Согласен с выше написанным. Остановлюсь на двух вериантах (поочерёдно).
1. Оставлю свой скрипт как есть, без вашего дополнения (индикатор капслока заблокирован и статус его не меняется). Здесь я пошёл обходным путём: создал в тулбаре кнопку, к-рая при отключении мют на первом треке - красная ("talkback работает"), а при включении мют - серая ("talkback отключён"). Кроме того первый трек для удобства спрятан.
2. Если в первом варианте на практике обнаружатся какие-то неудобства, придётся притащить на работу свой миди контроллер (Lexicon MRC)
Просто хотелось этого избежать, т.к. всего-то одна кнопка нужна - из пушки по воробьям получается, дома он (контроллер) мне больше нужен.
Но... С понедельника опробую первый вариант в рабочем процессе, а там видно будет.
Ещё раз спасибо за помощь.
 

Сейчас просматривают