Open5

ブラウザでPDFを閲覧しているときにhjklキーでスクロール/ページ遷移する方法 [Windows, Edge, AutoHotkey]

ras0qras0q

AutoHotkey v2を使う
Microsoft Edge以外の場合は都度exeファイル名を変更してください

2025/01/19修正版 2
1回だけDownを送るのではなくキーを押している間は連続的に送るようにすると滑らかにスクロールすることができます

pdf_move_with_hjkl.ahk
if WinActive("ahk_exe msedge.exe") && InStr(WinGetTitle("A"), ".pdf") {
    Space & h::Left
    Space & j:: {
        while GetKeyState("j", "P") {
            Send "{Down}"
            Sleep 10
        }
    }
    Space & k:: {
        while GetKeyState("k", "P") {
            Send "{Up}"
            Sleep 10
        }
    }
    Space & l::Right
    Space:: Send " "
}
[参考] 2025/01/19修正版

PDFを開きながらブラウザのサイドバーで別のアプリを起動する場合、そちらにもAutoHotkeyが適用されてしまうので<Space>+hjklに変更しました

pdf_move_with_hjkl.ahk
if WinActive("ahk_exe msedge.exe") && InStr(WinGetTitle("A"), ".pdf") {
    Space & h::Left
    Space & j::Down
    Space & k::Up
    Space & l::Right
    Space:: Send " "
}
[参考] 修正前
pdf_move_with_hjkl.ahk
if WinActive("ahk_exe msedge.exe") && InStr(WinGetTitle("A"), ".pdf") {
    h::Left
    j::Down
    k::Up
    l::Right
}

これを任意の場所に置いてエクスプローラーからダブルクリックで実行するとブラウザでPDFを閲覧しているときのみキーのリマップが行われる

ras0qras0q

ブラウザ拡張では無理か?

詳しく調べてない

PDF Viewer for Vimium Cという拡張機能があり、PDFビューアをブラウザのデフォルトのやつからPDF.jsに変更されるというデメリットと引き換えにhjklで移動できる
https://chromewebstore.google.com/detail/pdf-viewer-for-vimium-c/nacjakoppgmdcpemlfnfegmlhipddanj?hl=JA

デフォルトのビューアを使うならブラウザの外側から直接リマップするしかなさそう

ras0qras0q

PDFに限らずブラウザの機能でSpaceで1画面分次に、Shift+Spaceで1画面分前にスクロールできるので、PDFの高さをブラウザに調節してたらそっちの方が便利かも

AutoHotkeyのやつはSpaceを押しっぱなしにしておくとバグって止まらなくなったりする

ras0qras0q

話してもスクロールが止まらなくなるのはSendEventにしたら治る?

#Requires AutoHotkey v2.0
#SingleInstance Force

SetKeyDelay -1

SendWhile(key, message) {
    SendEvent message
    Sleep 20

    i := 0
    while GetKeyState(key, "P") {
        SendEvent message
        Sleep 20
        OutputDebug "Loop " GetKeyState(key, "P") GetKeyState("Space", "P") GetKeyState(key)

        i++
        if (i > 10000) {
            OutputDebug "Infinite loop detected, breaking out."
            break
        }
    }

    OutputDebug "End " GetKeyState(key, "P") GetKeyState("Space", "P")
    OutputDebug ""
}

Space:: Send "{Space}"
+Space::+Space
^Space::^Space
!Space::!Space

Space & h:: SendWhile("h", "{Left}")
Space & j:: SendWhile("j", "{Down}")
Space & k:: SendWhile("k", "{Up}")
Space & l:: SendWhile("l", "{Right}")