👨‍🦽

AutoHotKey,X-Mouse Button Controlを使った個人的ベストなリマップのメモ

に公開

はじめに

  • ほぼ自分用
  • 個人的に便利なスクリプトを記録する
  • 必要なもの
    • サイドボタンのあるマウス
    • AutoHotKey
    • X-Mouse Button Control
    • WindowsPC

AutoHotKeyとは

  • マウスやキーボードのリマップができたり
  • プログラムの実行など
  • 独自のスクリプト言語があり、マウスやキー操作をトリガーにしていろんなことができる便利ツール
    • 詳しくは以下記事などを参考に

https://qiita.com/eyuta/items/7fd4b536e58bfbdbf465

X-Mouse Button Controlとは

  • AutoHotKeyよりは単純
  • GUIでマウスのキー割当を変更できたりする便利ツール
    • 多分AutoHotKeyで全て置き換えることができると思う
    • ただ視覚的に分かりやすいので、単純な割当はこっちでやりたい派

https://forest.watch.impress.co.jp/docs/review/1483704.html

My お気に入り設定

1️⃣ ahk

パーツごとに分けて書く


ヘッダー部分
(v1とv2があるらしく、私は最新のv2を使ってる。)

#Requires AutoHotkey v2.0
#SingleInstance Force

IME変換ショートカット無効化
間違って押してしまうので、私にはいらなかった

;Windows+Space(言語切り替え)無効化
#Space::Return

vb6.exe
VB6エディタを使う場合にShift+ホイールで横スクロールをさせたかった
AIに書いてもらって実現

コード
#HotIf WinActive("ahk_exe VB6.EXE")

+WheelDown::VB6_HScroll(+2)  ; 右
+WheelUp::VB6_HScroll(-2)    ; 左

VB6_HScroll(step) {
    editHwnd := ControlGetFocus("A")
    if !editHwnd
        return

    sbHwnd := FindAnyHScrollBar(WinGetID("A"))
    if !sbHwnd
        return

    pos := SendMessage(0xE1, 0, 0, sbHwnd) ; SBM_GETPOS
    newPos := pos + step
    if (newPos < 0)
        newPos := 0

    hi := newPos & 0xFFFF          ; HIWORDを16bitに固定(ワープ防止の肝)
    low := 5                       ; SB_THUMBTRACK(4にすると環境によっては反応が変わる)
    wParam := (hi << 16) | low

    PostMessage 0x114, wParam, sbHwnd, editHwnd  ; WM_HSCROLL
}

FindAnyHScrollBar(rootHwnd) {
    found := 0
    cb := CallbackCreate((hwnd, lParam) => (
        found ? false : (
            WinGetClass("ahk_id " hwnd) = "ScrollBar"
            ? (
                style := DllCall("GetWindowLongPtr", "ptr", hwnd, "int", -16, "ptr"),
                !(style & 0x1) ? (found := hwnd, false) : true   ; SBS_VERTじゃない=横
            )
            : true
        )
    ), "Fast")
    DllCall("EnumChildWindows", "ptr", rootHwnd, "ptr", cb, "ptr", 0)
    CallbackFree(cb)
    return found
}

#HotIf

何やってるかはあまり把握してない笑
(Windows API(SendMessageなど)を使用して、コントロールに対して直接スクロールメッセージを送っているようです)


AnyDesk
リモート端末へ接続した際に「半角/全角」切り替えをする場合に
ローカル側が切り替わらないように

#HotIf WinActive("ahk_exe AnyDesk.exe")

$sc029::
{
    ; ローカルのIMEには「キーが押された」こと自体を隠蔽し、
    ; AnyDeskのウィンドウに対して直接、スキャンコードを送信する
    ControlSend "{sc029}",, "A"
    
    return
}
#HotIf

DBeaver
Ctrl + + (拡大)
と
Ctrl + -(縮小)
をShift+ホイールで実現させたかった

; DBeaverがアクティブな時のみ有効にする設定
#HotIf WinActive("ahk_exe dbeaver.exe")

^WheelUp::Send "^{+}"
^WheelDown::Send "^{-}"

#HotIf

Excel
Shift + ホイール でも横スクロール可能にする

; Excelがアクティブな時だけ有効にする
#HotIf WinActive("ahk_exe EXCEL.EXE") and !GetKeyState("Ctrl")

; Shift + ホイール上 (左スクロール)
+WheelUp::
{
    try {
        ; COM操作で直接スクロール (誤爆防止・確実)
        ; SmallScroll(Down, Up, ToRight, ToLeft)
        ; 最後の数字「1」がスクロール量です (1~5でお好みに調整可)
        ComObjActive("Excel.Application").ActiveWindow.SmallScroll(0, 0, 0, 1)
    } catch {
        ; エラー時(セル編集中などCOMが使えない時)は通常のキー送信に逃げる
        Send("{Blind}^{WheelUp}")
    }
}

; Shift + ホイール下 (右スクロール)
+WheelDown::
{
    try {
        ; SmallScroll(Down, Up, ToRight, ToLeft)
        ; 3番目の数字「1」がスクロール量です
        ComObjActive("Excel.Application").ActiveWindow.SmallScroll(0, 0, 1, 0)
    } catch {
        Send("{Blind}^{WheelDown}")
    }
}

2️⃣ X-Mouse Button Control

デフォルト
サイドボタン5にEnterキー
サイドボタン4はちょっと特殊

  • 単押しは「戻る」
  • 長押し(150ms経過後)は「Shift長押し」
  • キーに手を置かずにマウスだけで横スクロールがしたいとき用


excel
デフォルトと同じ理由で横スクロールを可能にするために工夫している
(AutoHotKey側と整合させる為にSHIFT+CTRLにしてる)

Discussion