前回は、「AutoHotkey」と「JoyToKey」というソフトを使って、複数のPCゲーム画面(複垢)を1つのゲームパッドで切り替える方法を紹介した。
その中で少し触れたのが、ウィンドウの自動整列。
複数のゲームを起動したあと、毎回マウスで一つひとつウィンドウを配置し直すのは、意外と手間がかかる。
そこで今回は、一瞬ですべてのウィンドウをあらかじめ指定したサイズと位置に整列させるAutoHotkey のスクリプトをシェアする。使用するゲームは今回もドラクエX。
さらにおまけとして、自分が使用しているゲームパッド「GameSir T4 Pro」の接続方法についても簡単に解説する。
ぜひ、前回の記事とあわせて読んでみてね。

このスクリプトでできること
「AutoHotkey」と「JoyToKey」がすでに導入されていることを前提に進める。
ソフトのインストールや使い方については、前回の記事を参照してほしい。
今回のスクリプトで実現できる機能は、次の通り。
・F16〜F19キーで、任意のウィンドウをスロット1〜4に登録
・登録済みウィンドウを「Ctrl + 1」のショートカットキーで、4分割で自動整列
・ゲームパッドのボタン操作で、アクティブなウィンドウを切り替える機能も継承
スロットと画面配置
スロット番号 | 配置位置 |
---|---|
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
にリネーム。

おまけ:「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のエンジョイ勢なので、頻繁にはログインできないけど、のんびり長く続けていくよ。

