AutoHotkey - 滚动两个 PDF 文档

AutoHotkey - 滚动两个 PDF 文档

我正在尝试编写一个脚本,用于同时滚动所有打开的 PDF 文档。问题是,除非我明确命名每个需要滚动的窗口并将操作发送给它,否则我无法让它工作。此外,在当前状态下,我需要在另一个窗口(例如记事本)中捕获滚动事件,但这实际上是可以的,因为我可能还想手动滚动一些 PDF,然后恢复同步滚动。

这是我的工作流程:

  1. 打开 2 个或更多 PDF 文档。
  2. 打开记事本文件并开始滚动到记事本文件中。

结果:所有打开的 PDF 开始滚动。

这是我的代码(借自 interwebz:)

WheelDown::
SetTitleMatchMode, 2
IfWinActive, Notepad ; Replace 'SafariTitle' by the title of the safari windows
{
        CoordMode, Mouse, Screen
        WinGet, active_id, ID, A
        IfWinExist, Adobe
        {
                Send {WheelDown}
                WinActivate ; Automatically uses the window found above.
                Send {WheelDown}
                Send {WheelDown}
                WinActivate, ahk_id %active_id%
        }

}
Else
{
        Send {WheelDown}
}
return

WheelUp::
SetTitleMatchMode, 2
IfWinActive, Notepad ; Replace 'SafariTitle' by the title of the safari windows
{
        CoordMode, Mouse, Screen
        WinGet, active_id, ID, A
        IfWinExist, Adobe
        {
                Send {WheelUp}
                WinActivate ; Automatically uses the window found above.
                Send {WheelUp}
                Send {WheelUp}
                WinActivate, ahk_id %active_id%
        }
        }
        Else
        {
                Send {WheelUp}
        }
return

目前它仅适用于滚动一个 PDF。

我怎样才能让它查看并滚动浏览所有这些内容?

答案1

找到了解决方案:

WheelDown::
SetTitleMatchMode, 2
IfWinActive, Notepad ;
{
        CoordMode, Mouse, Screen
    WinGet, active_id, ID, A        
    WinGet, id, list, Adobe,, Program Manager
        Loop, %id%
    {
        Send {WheelDown}
            this_id := id%A_Index%
            WinActivate, ahk_id %this_id%
            Send {WheelDown}
            Send {WheelDown}
            WinActivate, ahk_id %active_id%
        }

}
Else
{
        Send {WheelDown}
}
return

WheelUp::
SetTitleMatchMode, 2
IfWinActive, Notepad ;
{
        CoordMode, Mouse, Screen
        WinGet, active_id, ID, A
        WinGet, id, list, Adobe,, Program Manager
        Loop, %id%
    {
        Send {WheelUp}
            this_id := id%A_Index%
            WinActivate, ahk_id %this_id%
            Send {WheelUp}
            Send {WheelUp}
            WinActivate, ahk_id %active_id%
        }
        }
        Else
        {
                Send {WheelUp}
        }
return

现在它起作用了。您需要 Adob​​e Acrobat Reader(或 acrobat Pro,带有 acrobat 的软件)和记事本。

怎么运行的:

  1. 打开您想要同步滚动的PDF。

  2. 打开一个记事本窗口(这将是控制窗口,因此您也可以自主滚动 PDF(每个单独)。记事本窗口可以调整到非常小。

  3. 单击记事​​本窗口并滚动。

当您在记事本窗口中滚动时,每个 PDF 都会被选中并滚动。如果您想单独滚动,请手动选择每个 PDF。

答案2

这是一个更简单的解决方案,不需要记事本窗口。您可能需要将窗口标题从“Adobe Reader”更改为 Acrobat 窗口的标题。这将循环遍历所有名为“Adobe Reader”的窗口,并按 CTRL-SHIFT-N 增加页码

SetTitleMatchMode 2 ; Match anything with Adobe Reader anywhere in the title
WinGet, id, list,Adobe Reader,, Program Manager

    this_id := id1 ; Activate the first window, and find the current page number
    WinActivate, ahk_id %this_id%
    WinWaitActive, ahk_id %this_id%


Send, {CTRLDOWN}N{CTRLUP}
Sleep, 30
WinGetText, text  ; 

StringSplit, word_array, text, `n  ; The current page number is on the 3rd line of returned text
nextpage := word_array3
nextpage += 1  ; Increment and store the current page number

Send, %nextpage%{ENTER}
Sleep, 30


Loop, %id%  ; now loop through the rest of the windows and set each to the same page.
{
    this_id := id%A_Index%
    WinActivate, ahk_id %this_id%
    WinWaitActive, ahk_id %this_id%
    Send, {CTRLDOWN}N{CTRLUP}
    Sleep, 30
    Send, %nextpage%{ENTER}
    Sleep, 30

}

答案3

只是想说一下,我尝试了 Brett Bymaster 2014 年 2 月 28 日的脚本并且它运行得非常好。

然后我做了修改,将“WheelDown”改为“PgDn”,将“WheelUp”改为“PgUp”——这样我就可以使用 PgUp 和 PgDn 键一次滚动一页,而不是使用鼠标滚轮一次滚动几行——这正是我想要的。我能够非常快速地浏览一对 PDF,并通过视觉验证它们几乎完全相同,并找出它们的不同之处。

这种方法提供的单击单个 Adob​​e 窗口即可分别滚动文档的功能非常棒,因为(1)我遇到过同步滚动偏离页面的情况(可能是按键太快:),而这使我能够使其重新同步,并且(2)您可以从两个不一定在同一页面上排列的不同 PDF 中选择相似的部分并进行比较。

好东西,谢谢!

相关内容