ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】Twitter のタイムラインをノークリックでスクロールさせる 。

f:id:yasushiito:20190403184928p:plain
Twitter を眺めるのって大変じゃないです?
私のように指先不自由な人だとマウスホイールをゴロゴロするのもスクロールバーをカチカチクリックするのも結構しんどいんですよ。
かといって[新しいtweetを表示]ボタンをクリックすると、最新tweetに一気に飛んで広告もきっちり挟まれてしまいます。
もうちょっと楽にやりたい。
そこで以前に試した解決法は。

でした。
どちらも使い勝手がイマイチで結局日常的には使っていません。
調子が悪くて全く操作できない状況を想定して用意したスクリプトなので仕方ありません。
多少なりとも操作を許す条件であれば、もう少しましな動作にできるかと思います。
徐々にではありますがAutoHotkeyのスキルも上がってますしね。

大雑把な用件は次のように決めました。

  1. まず Twitter のタイムラインは Firefox で表示するものとします。
  2. tweetをクリックして詳細を見たり、いいねやretweetの操作は邪魔しないものとします。
  3. マウスポインターが一定期間ブラウザの左端あるいは右端に停滞していたらスクロールを開始します。
  4. Twitter ホーム(タイムライン)以外のページには反応しません。
  5. Firefox を終了させるとスクリプトも終了します。

もう少し詳細な仕様は次のようにしました。

  • スクロールエリアはブラウザの両端20pxとします。これ以上広くすると操作できない部品が出てきます。特に右端の縦スクロールバーは操作困難です。判定はマウスポインタとウィンドウの座標の計算で行います。当然ながらスクロールエリアは目視できません 。
  • マウスポインターがスクロールエリアに乗っているかを判定する間隔は250 msとします。あまり頻繁ですと OS のパフォーマンスが落ちそうなので。
  • スクロールが始まるのは、3回連続の750msの間にスクロールエリアに停滞していれば良いこととします。判定が 過敏すぎると関係ないマウス操作にも反応してしまいます。
  • 一度スクロールエリアから外れると、スクロールの処理は全て停止します。
  • スクロール処理はマウスホイールを転がすメッセージを使います。
  • ブラウザがアクティブでなくてもスクロールできるものとします。
  • マウスポインタがブラウザの上半分にある時は上方向にスクロール、下半分にある時は下方向にスクロールします。
  • ブラウザの上または下端に近づくほどスクロール速度が上がります。速さは4段階。最速で150msごとにスクロール。一番遅いのは600ms スパンでスクロールになります。

出来上がったスクリプトはこちら。

#Persistent
    twitterRollCnt := 0
    twitterRollSpdCnt := 0
    SetTimer, twitterRollWait, 250
    Return
twitterRollWait:
    test := twitterRollTest()
    if test < 0
    {
        SetTimer, twitterRollWait,Off
        SetTimer, twitterRoll,Off
        ExitApp
    }
    if test > 0
    {
        twitterRollCnt += 1
        If twitterRollCnt > 2
        {
            SetTimer, twitterRollWait,Off
            twitterRollCnt := 0
            twitterRollSpdCnt := 0
            SetTimer, twitterRoll, 150
        }
        return
    }
    twitterRollCnt := 0
    return
twitterRoll:
    test := twitterRollTest()
    if test < 0
    {
        SetTimer, twitterRollWait,Off
        SetTimer, twitterRoll,Off
        ExitApp
    }
    if test = 0
    {
        SetTimer, twitterRoll,Off
        twitterRollCnt := 0
        SetTimer, twitterRollWait, 250
        return
    }
    if test <= 4
    {
        ; up
        spd := test -1
        direction := - 1
    }
    Else
    {
        ; scroll down
        spd := 8 - test
        direction := 1
    }
    if twitterRollSpdCnt >= %spd%
    {
        twitterRollSpdCnt := 0
        if direction < 0
            Send,{WheelUp}
        Else
            Send,{WheelDown}
    }
    Else
    {
        twitterRollSpdCnt += 1
    }
    return
twitterRollTest(){
    prc := WinExist("ahk_exe firefox.exe")
    If prc = 0
    {
        return -1
    }
    fox := WinExist("ホーム / Twitter - Mozilla Firefox")
    If fox = 0
        return 0
    CoordMode,Mouse,Screen
    MouseGetPos, mx, my, ovid
    If fox = %ovid%
    {
        WinGetPos, wx, wy, ww, wh, ahk_id %fox%
        lbarl := wx
        lbarr := wx + 20
        rbarl := wx + ww -20
        rbarr := wx + ww
        f := 0
        if mx Between %lbarl% and %lbarr%
            f += 1
        if mx Between %rbarl% and %rbarr%
            f += 1
        if f > 0
        {
            rx := mx - wx
            ry := my - wy
            rng := Floor(wh / 8)
            stp := Floor(ry / rng) + 1
            return stp
        }
    }
    return 0
}


さすがに少々苦戦しました。
覚えた知識を総動員して作りました。
シフト JIS または Bom 付き UTF-8で保存してください。