You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现双窗口同步滚动?AHK脚本问题及优化需求咨询

双窗口同步滚动的完善实现方案(解决WheelDown失效&精准同步问题)

我帮你梳理下原来脚本里的几个核心问题,再给出一个适配所有需求的优化方案:

  • 原脚本里连续发送两次滚动按键会导致滚动过量,且切换窗口激活的方式会打断操作流畅性
  • Else分支里Send {A_ThisHotKey}是错误写法,变量无法被正确解析
  • 没有处理滚轮的实际滚动量,只是简单重复按键,没法做到等量同步

下面是优化后的完整脚本,支持WheelUp/WheelDown/PgUp/PgDn/Up/Down所有按键,还能精准同步滚动量,全程后台操作不打断当前窗口焦点:

; 把所有需要同步的滚动按键绑定到同一个处理逻辑,避免重复代码
WheelUp::WheelDown::PgUp::PgDn::Up::Down::
    ; 获取当前激活窗口的ID,用于后续保持焦点(如果需要)
    WinGet, activeWinID, ID, A
    ; 定义需要同步的目标窗口标题(这里是Sumatra,可根据实际修改)
    targetWinTitle := "Sumatra"
    
    ; 仅当当前激活窗口是Writer时触发同步逻辑
    IfWinActive, Writer
    {
        ; 提取当前触发的热键(去掉末尾的::)
        currentHotkey := SubStr(A_ThisHotKey, 1, -2)
        ; 获取滚轮的实际滚动量(Wheel类按键特有,正数为WheelDown,负数为WheelUp)
        scrollAmount := A_EventInfo
        
        ; 检查目标窗口是否存在,存在则执行同步
        IfWinExist, %targetWinTitle%
        {
            ; 分类型处理同步逻辑:滚轮按实际量同步,其他按键单次发送
            if (currentHotkey = "WheelUp" || currentHotkey = "WheelDown")
            {
                ; 后台发送滚轮指令,无需激活目标窗口,保证流畅性
                ControlSend,, {%currentHotkey% %scrollAmount%}, %targetWinTitle%
            }
            else
            {
                ; 处理PgUp/PgDn/Up/Down这类单次触发的按键
                ControlSend,, {%currentHotkey%}, %targetWinTitle%
            }
        }
        ; 无论是否同步,都要在当前窗口执行原按键操作
        Send %A_ThisHotKey%
    }
    else
    {
        ; 不在Writer窗口时,正常发送原按键,不触发同步
        Send %A_ThisHotKey%
    }
return

关键优化细节:

  • 统一热键逻辑:通过多热键绑定到同一标签的方式,用A_ThisHotKey自动识别当前按键,彻底避免重复代码
  • 后台同步滚动:使用ControlSend直接给目标窗口发送指令,无需切换窗口激活,既保证流畅性,又不会打断当前操作
  • 精准滚动量匹配:滚轮按键通过A_EventInfo获取系统返回的实际滚动增量,同步发送到目标窗口,实现完全等量的滚动
  • 修复原脚本错误:修正了非同步场景下的按键发送逻辑,确保所有按键在非同步状态下正常工作
  • 完美兼容需求:完全支持你需要的所有滚动类按键,且符合你提到的「后台滚动流畅、滚动条点击正常、不同速度不影响对比、编辑器行移动不触发PDF翻页」的所有要求

额外提示:

  • 如果目标窗口不是Sumatra,直接修改targetWinTitle变量的值即可(默认标题匹配模式为模糊匹配,支持部分标题内容)
  • 若需要调整部分按键的同步规则(比如Up/Down不需要同步),可在IfWinActive分支里添加额外的判断逻辑

内容的提问来源于stack exchange,提问作者Ooker

火山引擎 最新活动