Как одновременно пролистывать два окна?

Я хочу одновременно прокручивать два окна, но метод ввода горячих клавиш требует, чтобы я дублировал его несколько раз. Моя идея - использовать функциональные горячие клавиши и _ 1_, но WheelDown отключен в программе при использовании этого сценария:

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

Я хочу, чтобы ScrollKey соответствовал WheelUp, WheelDown, PgUp, PgDn, Up, Down.

В идеале, я думаю, сценарий должен определять, сколько прокручивается первая программа, а затем применять это количество ко второй. Преимущества:

  • Прокрутка будет плавной, так как другие программы прокручиваются в фоновом режиме.
  • Нажатие на полосу прокрутки работает
  • Различная скорость прокрутки не влияет на сравнение
  • При перемещении строк в текстовых редакторах страницы в средствах просмотра PDF не прокручиваются.


FYI: Send / SendRaw / SendInput / SendPlay / SendEvent: отправка ключей и клики
Как получить количество прокрутки в одном окне?
Также спрашивают на Reddit: Как одновременно прокручивать два окна?


person Ooker    schedule 21.01.2018    source источник
comment
Я пробовал использовать A_ThisHotKey, но не работает   -  person Ooker    schedule 21.01.2018
comment
Привет, Ooker, если какой-либо из ответов решил вашу проблему, не стесняйтесь пометить его как ответ, чтобы этот вопрос больше не без ответа в результатах поиска :) - Если ответа недостаточно, все же почувствуйте бесплатно комментировать и / или добавлять информацию к вашему вопросу относительно вашей конкретной проблемы.   -  person Marcus Mangelsdorf    schedule 19.04.2018
comment
Привет, @MarcusMangelsdorf, большое спасибо за ваши усилия. К сожалению, я еще не пробовал ваш метод для завершения проекта. Поскольку я еще не подтвердил, работает это или нет, я думаю, что, принимая это, я думаю, что это будет вводить в заблуждение будущих зрителей. Если это не проблема, я готов это сделать, так как есть больше шансов, что это просто сработает :)   -  person Ooker    schedule 19.04.2018


Ответы (2)


Попробуй это

#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
person user3419297    schedule 21.01.2018
comment
Не работает. Использование классов или процессов программ при добавлении их в группу не работает. А почему вы используете конкретное значение координат мыши (MouseMove, 200, 200, 0)? - person Ooker; 22.01.2018
comment
Попробуйте мой отредактированный ответ с помощью Блокнота и Блокнота ++. В моей системе WheelUp / WheelDown работают только в том случае, если указатель мыши находится над окном, которое необходимо прокрутить, поэтому в коде используются команды MouseGetPos и ​​MouseMove. - person user3419297; 22.01.2018
comment
он добавляет 0xd0450 во втором окне, если удерживаются клавиши со стрелками вверх или вниз, и d0450, если удерживаются PgUp и PgDn. Вы знаете, как определить количество прокрутки? Смотрите мою правку в вопросе - person Ooker; 23.01.2018

Основываясь на ответе user3419297, этот измененный сценарий позволяет вам определять заголовки двух приложений, которые вы хотите прокрутить вверху сценарий один раз:

#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
person Marcus Mangelsdorf    schedule 11.04.2018