How to simultaneously scroll two windows?

2019-05-18 19:16发布

I want to simultaneously scroll two windows, but the hotkey input method requires me to duplicate it multiple times. My idea is to use Function Hotkeys and A_ThisHotKey variable, but the WheelDown is disable in the program if using this script:

WheelDown::
ScrollKey := A_ThisHotKey
SetTitleMatchMode, 2
IfWinActive, Writer
{
        CoordMode, Mouse, Screen
        WinGet, active_id, ID, A
        IfWinExist, Sumatra
        {
                Send {ScrollKey}
                WinActivate ; Automatically uses the window found above.
                Send {ScrollKey}
                Send {ScrollKey}
                WinActivate, ahk_id %active_id%
        }
}
Else
{
        Send {A_ThisHotKey}
}
return

I want ScrollKey to match WheelUp, WheelDown, PgUp, PgDn, Up, Down.

Ideally, I think the script should detect how much the first program is scrolled, then apply that amount to the second one. Advantages:

  • Scrolling will be seamless since the other program are scrolled in the background
  • Clicking on the scrollbar works
  • Different scrolling speeds don't affect the comparison
  • Moving lines in text editors won't scroll pages in PDF viewers


FYI: Send/SendRaw/SendInput/SendPlay/SendEvent: Send keys & clicks
How to grab the scrolling amount in one window?
Also asked on Reddit: How to simultaneously scroll two windows?

2条回答
2楼-- · 2019-05-18 19:37

Based on user3419297's answer, this modified script allows you to define the titles of the two apps you want to scroll at the top of the script once:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance Force
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Process, Priority, , High
SetTitleMatchMode, 2

; Set your desired app names here. It is enough to use a part of the window's title
PART_OF_TITLE_OF_APP_A := "Notepad++"
PART_OF_TITLE_OF_APP_B := "Word"

GroupAdd, Scroll_Group, %PART_OF_TITLE_OF_APP_A%
GroupAdd, Scroll_Group, %PART_OF_TITLE_OF_APP_B%

SetWinDelay 0

#If (WinActive(PART_OF_TITLE_OF_APP_A) && WinExist(PART_OF_TITLE_OF_APP_B))
    || (WinActive(PART_OF_TITLE_OF_APP_B) && WinExist(PART_OF_TITLE_OF_APP_A))

    WheelUp::
    WheelDown::
    PgUp::
    PgDn::
    Up::
    Down::  
        MouseGetPos, mX, mY
        Send {%A_ThisHotKey%}
        GroupActivate Scroll_Group  ; activate the next window of this group
        If (A_ThisHotKey = "WheelUp" || A_ThisHotKey = "WheelDown")
            MouseMove, 200, 200, 0  ; move the mouse over the currently active window 
        Send {%A_ThisHotKey%}   
        GroupActivate Scroll_Group
        MouseMove, mX, mY, 0
    return
查看更多
趁早两清
3楼-- · 2019-05-18 19:57

Try this

#SingleInstance Force
Process, Priority, , High

; SetTitleMatchMode, 2

GroupAdd, Scroll_Group, ahk_class Notepad
GroupAdd, Scroll_Group, ahk_class Notepad++

SetWinDelay 0

#If (WinActive("ahk_class Notepad") && WinExist("ahk_class Notepad++")) || (WinActive("ahk_class Notepad++") && WinExist("ahk_class Notepad"))

    WheelUp::
    WheelDown::
    PgUp::
    PgDn::
    Up::
    Down::  
        MouseGetPos, mX, mY
        Send {%A_ThisHotKey%}
        GroupActivate Scroll_Group  ; activate the next window of this group
        If (A_ThisHotKey = "WheelUp" || A_ThisHotKey = "WheelDown")
            MouseMove, 200, 200, 0  ; move the mouse over the currently active window 
        Send {%A_ThisHotKey%}   
        GroupActivate Scroll_Group
        MouseMove, mX, mY, 0
    return

#If
查看更多
登录 后发表回答