アプリを起動してから、ウィンドウを最大化したり、左右に並べたりする操作は、毎日繰り返すほど面倒になります。
私は普段、メモ帳とVisual Studio Codeを並べて作業することが多く、マウスでアプリを探して起動し、ウィンドウサイズを調整する手順を省略したいと考えました。そこで、AutoHotkey v2を使い、キーボードショートカットだけで次の操作をできるようにしました。
- アプリが起動していなければ起動する
- 起動済みなら既存のウィンドウを再利用する
- 対象ウィンドウをアクティブにする
- 画面の左半分、右半分などに配置する
この記事では、実際にWindows環境で試したスクリプトを紹介します。
AutoHotkeyを準備する
まず、AutoHotkey v2をインストールします。公式サイトからインストーラーを入手して、通常の設定でインストールしました。
インストール後、デスクトップなどで右クリックし、「新規作成」からAutoHotkey Scriptを作成します。ファイル名は、例えば次のようにしました。
app-layout.ahk
作成したファイルを右クリックして「Edit Script」を選ぶと、エディターで編集できます。
今回はAutoHotkey v2用の構文を使うため、スクリプトの先頭に次の行を追加します。
#Requires AutoHotkey v2.0
#SingleInstance Force
#SingleInstance Forceを指定しておくと、スクリプトを再実行したときに古いプロセスが残らず、設定変更をすぐ試せます。
アプリを起動してウィンドウを取得する
まず、アプリの起動とウィンドウ取得を共通化します。
LaunchOrActivate(runTarget, winTitle) {
hwnd := WinExist(winTitle)
if !hwnd {
try {
Run(runTarget)
} catch Error as err {
MsgBox("アプリを起動できませんでした。`n`n" runTarget)
return 0
}
; 最大10秒間、対象ウィンドウが現れるのを待つ
hwnd := WinWait(winTitle, , 10)
}
if !hwnd {
MsgBox("ウィンドウが見つかりませんでした。`n`n" winTitle)
return 0
}
; 最小化されていた場合に元へ戻す
WinRestore("ahk_id " hwnd)
WinActivate("ahk_id " hwnd)
WinWaitActive("ahk_id " hwnd, , 2)
return hwnd
}
WinExist()で対象ウィンドウを探し、見つからない場合だけRun()で起動します。
ここで使っているahk_exeは、ウィンドウタイトルではなく実行ファイル名で対象を指定する方法です。タイトルバーの文字列は開いているファイル名などで変わるため、アプリを特定する用途ではahk_exeのほうが安定しました。
画面の左右半分へ配置する
次に、取得したウィンドウを画面の左半分または右半分へ移動する関数を作ります。
MoveToHalf(hwnd, side) {
; 1番目のモニターの作業領域を取得
MonitorGetWorkArea(1, &left, &top, &right, &bottom)
screenWidth := right - left
screenHeight := bottom - top
halfWidth := Floor(screenWidth / 2)
if side = "left" {
x := left
width := halfWidth
} else {
x := left + halfWidth
width := screenWidth - halfWidth
}
WinMove(
x,
top,
width,
screenHeight,
"ahk_id " hwnd
)
}
画面サイズを固定値で書くこともできますが、解像度が変わると調整が必要になります。MonitorGetWorkArea()を使うと、タスクバーを除いた作業領域を取得できるため、ノートPCと外部ディスプレイで同じスクリプトを使いやすくなります。
MonitorGetWorkArea(1, ...)の1は、1番目のモニターを意味します。別のモニターへ配置したい場合は、モニター番号を変更します。
ショートカットを割り当てる
ショートカットを押してからアプリを起動・再利用し、ウィンドウを配置するまでの流れは次の通りです。
ここまでの関数を組み合わせ、Ctrl+Alt+数字キーにアプリを割り当てます。
#Requires AutoHotkey v2.0
#SingleInstance Force
LaunchOrActivate(runTarget, winTitle) {
hwnd := WinExist(winTitle)
if !hwnd {
try {
Run(runTarget)
} catch Error as err {
MsgBox("アプリを起動できませんでした。`n`n" runTarget)
return 0
}
hwnd := WinWait(winTitle, , 10)
}
if !hwnd {
MsgBox("ウィンドウが見つかりませんでした。`n`n" winTitle)
return 0
}
WinRestore("ahk_id " hwnd)
WinActivate("ahk_id " hwnd)
WinWaitActive("ahk_id " hwnd, , 2)
return hwnd
}
MoveToHalf(hwnd, side) {
MonitorGetWorkArea(1, &left, &top, &right, &bottom)
screenWidth := right - left
screenHeight := bottom - top
halfWidth := Floor(screenWidth / 2)
if side = "left" {
x := left
width := halfWidth
} else {
x := left + halfWidth
width := screenWidth - halfWidth
}
WinMove(x, top, width, screenHeight, "ahk_id " hwnd)
}
; Ctrl + Alt + 1:メモ帳を左半分へ
^!1::{
hwnd := LaunchOrActivate(
"notepad.exe",
"ahk_exe notepad.exe"
)
if hwnd
MoveToHalf(hwnd, "left")
}
; Ctrl + Alt + 2:Visual Studio Codeを右半分へ
^!2::{
hwnd := LaunchOrActivate(
"code.exe",
"ahk_exe Code.exe"
)
if hwnd
MoveToHalf(hwnd, "right")
}
^はCtrl、!はAltを表します。つまり、^!1はCtrl+Alt+1です。
Visual Studio Codeの実行ファイルがPATHに登録されていない環境では、code.exeで起動できない場合があります。その場合は、実際の実行ファイルのパスを指定します。
"C:\Users\ユーザー名\AppData\Local\Programs\Microsoft VS Code\Code.exe"
このパスは環境によって異なるため、エクスプローラーでCode.exeの場所を確認して置き換えてください。
実行と自動起動
保存した.ahkファイルをダブルクリックすると、スクリプトが実行されます。タスクトレイにAutoHotkeyのアイコンが表示されれば準備完了です。
私の環境では、最初にCtrl+Alt+1を押すとメモ帳が起動して左半分へ移動し、もう一度押すと新しいメモ帳を起動せず、同じウィンドウを前面に表示できました。
Windows起動時にも使いたい場合は、Win + Rで「ファイル名を指定して実行」を開き、次のコマンドを入力します。
shell:startup
開いたフォルダーに.ahkファイルのショートカットを置きます。次回からWindowsへサインインしたときに、自動的にスクリプトが起動します。
ショートカットの競合が気になる場合は、^!1の部分を#1に変更して、Win+1など別の組み合わせにすることもできます。ただし、Windows標準のショートカットと重なる可能性があるため、私はCtrl+Altの組み合わせを使っています。
まとめ
AutoHotkeyを使うと、アプリの起動とウィンドウ配置を1つのショートカットにまとめられます。
今回のポイントは次の3つです。
-
Run()でアプリを起動する -
WinExist()とWinWait()で起動済みウィンドウを再利用する -
MonitorGetWorkArea()とWinMove()で画面上の位置を調整する
アプリを追加する場合は、実行ファイルとahk_exeの名前を変更し、新しいホットキーを追加すれば対応できます。よく使うブラウザー、ターミナル、チャットツールなどを登録しておくと、作業開始時の定型操作をかなり短縮できます。