【効率アップ】複数のゲーム画面を自動整列!AutoHotkeyスクリプト公開!

記事内に商品プロモーションを含む場合があります。
①〜④と描かれた画像をWindowsの画面上に配置しているところのスクリーンショット

前回は、「AutoHotkey」と「JoyToKey」というソフトを使って、複数のPCゲーム画面(複垢)を1つのゲームパッドで切り替える方法を紹介した。

その中で少し触れたのが、ウィンドウの自動整列

複数のゲームを起動したあと、毎回マウスで一つひとつウィンドウを配置し直すのは、意外と手間がかかる。

そこで今回は、一瞬ですべてのウィンドウをあらかじめ指定したサイズと位置に整列させるAutoHotkey のスクリプトをシェアする。使用するゲームは今回もドラクエX。

さらにおまけとして、自分が使用しているゲームパッド「GameSir T4 Pro」の接続方法についても簡単に解説する。

ぜひ、前回の記事とあわせて読んでみてね。

あわせて読みたい
【効率アップ】複数のゲーム画面(複垢)を1つのゲームパッドでラクラク切り替え!AutoHotkey × JoyToKey ... このページで利用している株式会社スクウェア・エニックスを代表とする共同著作者が権利を所有する画像の転載・配布は禁止いたします。(C) ARMOR PROJECT/BIRD STUDIO/S...
目次

このスクリプトでできること

「AutoHotkey」と「JoyToKey」がすでに導入されていることを前提に進める。

ソフトのインストールや使い方については、前回の記事を参照してほしい。

今回のスクリプトで実現できる機能は、次の通り。

スロットと画面配置

スロット番号配置位置
1左上
2右上
3左下
4右下

機能追加版スクリプト:前回同様コピペでOK!

前回作成した WindowSwitcher.ahk に以下のコードをコピペ(差し替え)して、上書き保存するだけで使えるようになる。

#Requires AutoHotkey v2.0
#SingleInstance Force
Persistent

global hwnds := Map()
global iniFile := A_ScriptDir "\WindowSwitcher.ini"

GetWorkArea() {
    MONITORINFO := Buffer(40, 0)
    NumPut("uint", 40, MONITORINFO, 0)
    hMonitor := DllCall("MonitorFromPoint", "int64", 0, "uint", 1)
    DllCall("GetMonitorInfoW", "ptr", hMonitor, "ptr", MONITORINFO)

    left   := NumGet(MONITORINFO, 20, "int")
    top    := NumGet(MONITORINFO, 24, "int")
    right  := NumGet(MONITORINFO, 28, "int")
    bottom := NumGet(MONITORINFO, 32, "int")

    return { left: left, top: top, right: right, bottom: bottom }
}

Loop 4 {
    i := A_Index
    val := IniRead(iniFile, "HWNDs", i, "0")
    hwnds[i] := val + 0 ;
}

F16::RegisterHWND(1)
F17::RegisterHWND(2)
F18::RegisterHWND(3)
F19::RegisterHWND(4)

^q::ActivateSlotWindow(1)
^w::ActivateSlotWindow(2)
^e::ActivateSlotWindow(3)
^r::ActivateSlotWindow(4)
^1::PositionAllSlotWindows()

RegisterHWND(slot) {
    global hwnds, iniFile
    hwnd := WinExist("A")
    hwnds[slot] := hwnd
    IniWrite(hwnd, iniFile, "HWNDs", slot)
    ToolTip "ウィンドウ " slot " を登録しました"
    SetTimer(RemoveToolTip, -1000)
}

ActivateSlotWindow(slot) {
    global hwnds
    if hwnds.Has(slot) && WinExist("ahk_id " hwnds[slot])
        WinActivate("ahk_id " hwnds[slot])
    else {
        ToolTip "スロット " slot " のウィンドウが見つかりません"
        SetTimer(RemoveToolTip, -1500)
    }
}

PositionAllSlotWindows() {
    global hwnds

    area := GetWorkArea()
    workingAreaX := area.left
    workingAreaY := area.top
    workingAreaW := area.right - area.left
    workingAreaH := area.bottom - area.top

    halfW := workingAreaW // 2
    halfH := workingAreaH // 2

    coords := [
        [workingAreaX, workingAreaY],
        [workingAreaX + halfW, workingAreaY],
        [workingAreaX, workingAreaY + halfH],
        [workingAreaX + halfW, workingAreaY + halfH]
    ]

    Loop 4 {
        slot := A_Index
        if hwnds.Has(slot) {
            hwnd := hwnds[slot]
            if WinExist("ahk_id " hwnd) {
                WinActivate("ahk_id " hwnd)
                Sleep(100)
                x := coords[slot][1]
                y := coords[slot][2]
                Try DllCall("MoveWindow", "ptr", hwnd, "int", x, "int", y, "int", halfW, "int", halfH, "int", 1)
                Catch {
                    ToolTip "スロット " slot " のウィンドウを移動できませんでした"
                    SetTimer(RemoveToolTip, -1500)
                }
            }
        }
    }
}

RemoveToolTip(*) {
    ToolTip()
}

※ネットからダウンロードしたスクリプトは、悪意のあるコードが含まれている可能性がゼロではないため、自分で用意することを推奨する。

スクリプトのメモ

自分の環境は、MacBook上で「Parallels Desktop」を使用してWindowsを動かしている。
その影響なのか、WinMove()がうまく機能しなかった。

そこで代替案として、DllCall("MoveWindow")を使うことにした。
これは、Windows APIのMoveWindow関数を直接呼び出して、ウィンドウの位置やサイズを制御している。

この方法なら、純正のWindows環境や仮想デスクトップ上でも動作するはず。

また、タスクバーを除いた領域を取得して、その範囲内でウィンドウを配置したり、リサイズしたりするように調整している。(これをしないと位置がずれるから何度も修正。少し隙間はできちゃうな……)

さらに前回からの変更点として、関数名をSwitchTo からActivateSlotWindow にリネーム。

あわせて読みたい
MacでWindows環境を実現!「Parallels Desktop」のインストール&トラブル解決メモ iMacとMacBookユーザーのスイフー。スマホはiPhoneで、AirPodsも愛用しているけれど、Vision Proは買っていないからApple信者ではないよね。以前購入した「CeVIO AI 東...

おまけ:「GameSir T4 Pro」を Bluetoothで接続する方法

おまけとして、ゲームパッド「GameSir T4 Pro」の接続方法を紹介。

「GameSir T4 Pro」には、接続用のUSBレシーバーが付属しているが、それを使わずにBluetoothでも直接PCと接続可能

ただし、Homeボタンの長押しでランプを点滅させるだけでは、Bluetooth機器として認識されない。

このあたりが少し複雑で、うまく接続できずに困っている人がいるかもしれない。

もし、Bluetooth接続を諦めていた人がいたら、以下の方法を試してみてほしい。

1. ゲームパッドの電源がオフの状態で、「Homeボタン + Bボタン」を同時に長押し
2. ランプが点滅したら、Bluetoothのペアリングモードに入る
3. PCのBluetooth設定から「GameSir T4 Pro」を選択して接続

「Home + A」は Android、「Home + X」は iOS、「Home + Y」は Nintendo Switch といったように、同時押しするボタンで接続モードが変わるようだ。

編集後記

おめでとう!これでさらに快適な複垢ライフが送れるぞ!

ゲーム以外にも、攻略サイトやYouTube、Spotifyなど、さまざまなウィンドウを自動整列させたい場合に活用できる。ぜひ色々試してみてね。

ちなみに自分はドラクエXのエンジョイ勢なので、頻繁にはログインできないけど、のんびり長く続けていくよ。

よかったらシェアしてね!
  • URLをコピーしました!
目次