2019-07-15 (Mon) [長年日記]

_ [ahk]ホイールとか

Windows で何かを押しながらマウス移動でホイールをシミュレートするやつ2019版。その前に普通のホイールを加速するやつも付いてるけど、もちろんこっちは消してもいい。

CoordMode, Mouse, Screen

; あとで使う透明マウスポインタ
VarSetCapacity(AFF, 32 * 4, 0xFF)
VarSetCapacity(X00, 32 * 4, 0x00)

; cf. https://www6.atwiki.jp/eamat/pages/32.html
WheelUp::
WheelDown::
 MouseGetPos, x, y, hwnd, ctrl, 1
 ; UWP?
 If (ctrl == "")
  WinGetClass, ctrl, ahk_id %hwnd%
 If (ctrl ~= "^Windows\.UI\.Core\.CoreWindow")
 {
  ; 適当に加速 (間隔700ms未満から加速し、400ms未満はもっと加速)
  v := 1
  If ((A_PriorHotkey == A_ThisHotkey)
      and (A_TimeSincePriorHotkey < 700))
   v += Floor((700 - A_TimeSincePriorHotkey) / 300) ** 3
  SendInput, {Blind}{%A_ThisHotkey% %v%}
  Return
 }
 v := (A_ThisHotkey == "WheelUp") ? 1 : -1
 If ((A_PriorHotkey == A_ThisHotkey)
     and (A_TimeSincePriorHotkey < 700))
  v *= 1 + ((700 - A_TimeSincePriorHotkey) / 300) ** 3
 ; 適当に進む (120は、マウスの設定で1行にしているとき用って感じ)
 PostMessage, 0x20A, Floor(120 * v) << 16
                   , (y << 16) | x
                   , %ctrl%, ahk_id %hwnd%
 Return

; 中央ボタンを押しながらマウス移動でホイール動作のふり
*MButton::
 MouseGetPos, sx, sy, hwnd, ctrl, 1
 ; UWP?
 If (ctrl == "")
  WinGetClass, ctrl, ahk_id %hwnd%
 uwp := (ctrl ~= "^Windows\.UI\.Core\.CoreWindow")
 ; カーソル隠しとこう
 bc := DllCall("CreateCursor", "UInt", 0, "Int", 0, "Int", 0, "Int", 32, "Int", 32, "UInt", &AFF, "UInt", &X00)
 DllCall("SetSystemCursor", "UInt", bc, "Int", 32512) ; ノーマル
 bc := DllCall("CreateCursor", "UInt", 0, "Int", 0, "Int", 0, "Int", 32, "Int", 32, "UInt", &AFF, "UInt", &X00)
 DllCall("SetSystemCursor", "UInt", bc, "Int", 32513) ; 文字Iビーム
 moved := false
 While GetKeyState("MButton", "P")
 {
  MouseGetPos, x, y
  If ((delta := sy - y) = 0)
   Continue
  Else
   moved := true
  If (!uwp)
  {
   PostMessage, 0x20A, ((delta*Abs(delta)) << 16) | mods()
                     , (sy << 16) | sx
                     , %ctrl% , ahk_id %hwnd%
  }
  Else
  {
   wud := (delta > 0) ? "WheelUp" : "WheelDown"
   SendInput, {Blind}{%wud%}
  }
  ; マウスカーソルが動いてしまっているので、元に戻す
  MouseMove, sx, sy, 0
  Continue
 }
 ; カーソル表示
 DllCall("SystemParametersInfo", "UInt", 0x57, "UInt", 0, "UInt", 0, "UInt", 0)
 ; ここでモディファイアが効いてるかどうかは知らん
 If (!moved)
  MouseClick, Middle
 Return

mods()
{
 Return (1 << 0) * GetKeyState("LButton")
      | (1 << 1) * GetKeyState("RButton")
      | (1 << 2) * GetKeyState("Shift")
      | (1 << 3) * GetKeyState("Ctrl")
      | (1 << 4) * GetKeyState("MButton")
      | (1 << 5) * GetKeyState("XButton1")
      | (1 << 6) * GetKeyState("XButton2")
}

«前の日記(2019-07-02 (Tue)) 最新