让快捷键在【按下】【按住】【抬起】时分别运行不同快捷方式的脚本

这是一个可以自定义每个快捷键在按下、按住和抬起时分别运行不同快捷方式的脚本,可以看作是action list的一个小型扩展。

1、必要准备

SWS 和 JS_ReaScriptAPI64 是两个必须的依赖库。SWS安装属于基本操作不多介绍。JS_ReaScriptAPI64可以通过reapack安装,也可以下载我上传的这个版本,放到安装路径下的userplugins文件夹里,重启reaper
reaper_js_ReaScriptAPI64.zip (388.2 KB)

2、安装

脚本包含两个文件:DSY_快捷键.lua 是脚本主体,DSY_GUI.lua 是图形库。两个文件下载后必须放在同一路径下,然后单独把 DSY_快捷键.lua加载到action list里,DSY_GUI.lua放着就好不用管
DSY_快捷键.lua (17.3 KB)
DSY_GUI.lua (24.9 KB)

3、主界面介绍

image-20210519020651829

脚本主界面很简单,上方左边的开关代表设置的快捷键是否生效,右边的设置按钮用来打开设置页面。下方三个框代表三个功能键的按键状态,按下后会亮起,抬起后熄灭

第一次运行后会生成一个叫 DSY_快捷键.ini 的文件用于保存设置,注意不要误删

4、设置界面介绍

点击设置按钮可以打开设置界面,这里可以自定义各种单键和组合键对应的快捷方式。如上图所示,这里我设置了空格键的效果是“按下键的时候播放,放开键的时候停止”

  • 区域1是一个虚拟键盘,可以点击选择你要添加或编辑快捷方式的键。有设置过的键如图会亮起紫色,没有则为灰色。上图显示的是TabSpaceDelete 三个单键有设置过至少一个快捷方式

  • 点击功能键 CtrlShiftAlt 相应的键会亮起蓝色。其他键会根据三个功能键的开启状态而实时切换颜色,用于设置组合键的

  • 区域2不能操作,仅用于显示当前用户正在编辑的键或组合键

  • 区域3用于设置选中键的快捷方式,三个框分别对应按下、抬起、按住时运行的内容。点击后会弹出action list,供用户选择希望运行的快捷方式,选中后点击 Select/close按键,或直接关闭窗口,快捷方式的名字会出现在相应动作的框里面,代表设置成功

  • 如果需要修改已经设置过的快捷方式,可以点击相应的框重新设置一次

  • 如果需要删除设置过的快捷方式,右击相应的框并点击确定

  • 点击右上角的 X 键可以关闭设置窗口回到主界面

  • 只有在脚本启动并打开开关,且设置窗口关闭的时候,设定的快捷键才会起效

  • 注意,脚本的设置和action list的设置不冲突,两边会同时起作用。也就是说,假如你在action list里某个action绑定了空格键,而脚本里也为空格键设置了快捷方式的话,按下空格键后两边设置的快捷方式会同时运行。所以如果有这种情况,请把action list里已经绑定过的相同的键删掉

  • 不要试图设置一些系统里高优先级的组合键,比如Alt+Space,这样将只会呼出系统菜单,而不会启动你设置好的快捷方式

  • 在脚本编写的初期,我发现偶尔会出现由切换窗口引起的功能键被识别成一直按下的状态,尽管我已经设计了让功能键复位的方法,但为了排除未知的原因,用户需要不时观察一下主界面下面三个功能键指示框。若某个指示框在你没有按键的情况下一直保持常亮,请按一下对应的功能键手动复位,否则会导致快捷键识别错误-

  • 我做了三个测试用的脚本,效果分别为打印出“按下”、“抬起”、“按住”,可用于测试脚本是否起效
    DSY_测试 按住.lua (91 字节)
    DSY_测试 按下.lua (91 字节)
    DSY_测试 抬起.lua (91 字节)

5、已知问题

如果使用action list的 New project tab 命令,并且和带有功能键的快捷键绑定的话,运行这个命令时,里面用到的功能键会和上述情况那样,被识别成一直按下的状态

1 Like

牛逼。我以为检测按住一定要用系统级(外部)的软件才能知道。

原理是对比当前状态和上一个状态,那按住就是当前和上一个都处于按下状态

1 Like

看起来很好用,感谢分享!
reaper.JS_VKeys_GetState 已知的bug:快捷键长按不放,鼠标点击reaper之外的区域或者点击鼠标右键就会出错,哪怕已经松掉快捷键了,还是一直发送按下的信号。

这个在我这个脚本里不是问题,已经解决,解决不了的情况已经写在上面

我也看到那张贴你的留言,不过现在才发现那个原来是你发的

是啊,官方论坛那么多人,其实真正活跃的就那么几爷子。