AutoHotkeyは、Windows環境でスクリプトを使ってタスクを自動化したり、カスタムツールを作成するための非常に便利なツールです。前回はAutoHotkey v2の基本的な使い方をご説明しましたが、今回はAutoHotkey v2のGUIの作成方法について、サンプルスクリプトを見ながら説明していきます。アイディア次第でオリジナルランチャーとしても使用できますよ。
①このページでは、AutoHotkey v2のGUIの作成方法がわかります。
②AutoHotkey v2のGUIを扱うサンプルスクリプトを用意しています。
先にAutohotkeyの基本を知りたい場合は、次の記事をご参照ください。
AutoHotkeyのGUI作成の基本的な流れ

AutoHotkeyのGUI作成の流れは次の通りです。
- GUIオブジェクトの作成:
Gui()関数を使用して、GUIオブジェクトを作成します。
例:GuiObj := Gui() - GUI要素(コントロール)の追加:
GUI内に表示する要素(ボタン、テキストボックス、リストなど)をGUIオブジェクトのAddメソッドを使用して追加します。
例:Button := GuiObj.Add(“Button”, “Default”, “OK”) - イベントハンドラーの設定:
ボタンのクリックやテキストボックスへの入力などのイベントに対応するアクションを設定します。
例:Button.OnEvent(“Click”, ButtonAction) - GUIの表示:
Show()メソッドを使ってGUIオブジェクトを表示します。
例:GuiObj.Show(“w400 h300 Center”) - 閉じるイベントの設定:
ウィンドウが閉じられたときの処理を設定します。閉じる際にリソース解放や終了処理を実行できます。
例:GuiObj.OnEvent(“Close”, GuiClose)
AutoHotkeyでよく使うGUIコントロールとオプション
1. コントロールの種類
主なGUIコントロールを示します。どのコントロールも事前にMyObj := Gui() で作成したGUIオブジェクトにAddメソッドで追加して使用します。
種類 | 説明 | 使用例 |
---|---|---|
Text | ラベル用のテキスト | MyGui.Add(“Text”,, “Please enter your name:”) |
Edit | テキスト入力用のボックス | MyGui.Add(“Edit”, “r9 vMyEdit w135”, “Text Test.”) |
Button | ボタン | MyBtn := MyGui.Add(“Button”, “Default w80”, “OK”) MyBtn.OnEvent(“Click”, MyBtn_Click) ; クリックされたときにMyBtn_Clickをコールします。 |
Checkbox | チェックボックス | MyGui.Add(“CheckBox”, “vShipToBillingAddress”, “Ship to billing address?”) |
Radio | ラジオボタン | MyGui.Add(“Radio”, “vMyRadioGroup”, “Wait for all items to be in stock before shipping.”) |
ListBox | リストボックス | MyGui.Add(“ListBox”, “r5 vColorChoice”, [“Red”,”Green”,”Blue”]) |
DropDownList | ドロップダウンリスト | MyGui.Add(“DropDownList”, “vColorChoice”, [“Black”,”White”,”Red”]) |
詳しくは、AutoHotkey 公式サイトのGUIコントロールページをご覧ください。
2. サイズと配置のオプション
上記のいくつかのコントロールの使用例でも出てきていますが、コントロールはサイズや配置を指定する事ができます。主なオプションを説明します。
オプション | 説明 |
---|---|
wNNN | 幅を指定(例: w300 ) |
hNNN | 高さを指定(例: h200 ) |
xNNN | X座標を指定 |
yNNN | Y座標を指定 |
Center | ウィンドウを画面中央に配置 |
Autohotkey v2のGUIのサンプルスクリプト
(基本編)ホットキーで起動する簡単なGUIのサンプルスクリプト
早速簡単なGUI作成を行います。後でこのGUIの応用編もご覧いただきますので、ここでしっかり基礎を抑えましょう。
以下のスクリプトでは、Ctrl+Shift+Gを押すと入力ボックスとボタンを備えたシンプルなGUIが起動します。

次のソースを.ahkファイルに張り付けてください。
; グローバル変数としてGUIオブジェクトを宣言
global MyGui := ""
; ホットキーを設定(例:Ctrl + Shift + G)
^+g::
{
global
; GUIがまだ作成されていない場合のみ作成
if !IsObject(MyGui)
{
; 新しいGUIを作成
MyGui := Gui()
MyGui.OnEvent("Close", GuiClose) ; GUIが閉じられた時の処理
MyGui.SetFont("s10") ; フォントサイズを設定
; コントロールを追加
MyGui.Add("Edit", "vs_Word w400", "AutoHotkey v2のGUIです。")
gcMyGuiButton := MyGui.Add("Button", "Default Section", "ボタン")
gcMyGuiButton.OnEvent("Click", ButtonAction) ;Default Selectionは、Enterで実行されるボタンであり、ボタンが選択状態になるわけではない。
}
; GUIを表示またはアクティブ化
MyGui.Show("w500 h100")
}
; ボタンがクリックされた時のアクション
ButtonAction(*)
{
oSaved := MyGui.Submit()
MsgBox(oSaved.s_Word)
}
; GUIが閉じられた時の処理
GuiClose(GuiObj)
{
GuiObj.Destroy() ; GUIオブジェクトを破棄
MyGui := "" ; グローバル変数を空文字列に設定(または削除)
}
スクリプトの解説
global MyGui := ""
: グローバル変数MyGui
を宣言し、空文字列で初期化します。グローバル変数はスクリプト全体でアクセス可能です。重要なのは、ここでは宣言のみ行っていることです。オブジェクトの代入はGUI作成時まで遅延させます。これが以前のエラーを解消する鍵となります。^+g::
: Ctrl + Shift + Gの組み合わせをホットキーとして定義します。このキーを押すと、続くブロックのコードが実行されます。ホットキーサブルーチンのglobal
: ホットキーサブルーチン(^+g::
で始まるブロック)の先頭にglobal
キーワードを記述することで、サブルーチン内でMyGui
をグローバル変数として使用することを明示的に宣言しています。これにより、サブルーチン内でMyGui
がローカル変数として扱われるのを防ぎます。if !IsObject(MyGui)
:MyGui
がオブジェクトでない(つまり、GUIがまだ作成されていない)場合にのみ、GUIの作成処理を行います。これにより、GUIが重複して作成されるのを防ぎます。MyGui := Gui()
: 新しいGUIウィンドウを作成し、そのオブジェクトをMyGui
に代入します。ここで初めてMyGui
がオブジェクトになります。MyGui.OnEvent("Close", GuiClose)
: GUIウィンドウが閉じられたときに実行する関数としてGuiClose
を指定します。MyGui.SetFont("s10")
: GUIのフォントサイズを10に設定します。MyGui.Add("Edit", "vs_Word w400", "AutoHotkey v2のGUIです。")
: GUIにEditコントロール(テキスト入力欄)を追加します。vs_Word
は変数の関連付けを指定し、後でMyGui.Submit()
でこのコントロールの内容を取得するために使用します。w400
は幅を400ピクセルに設定します。gcMyGuiButton := MyGui.Add("Button", "Default Section", "ボタン")
: GUIにボタンを追加します。Default Section
を指定することで、Enterキーを押したときにこのボタンが押されたのと同じ動作になります。戻り値を変数gcMyGuiButton
に格納しています。gcMyGuiButton.OnEvent("Click", ButtonAction)
: ボタンがクリックされたときに実行する関数としてButtonAction
を指定します。MyGui.Show("w500 h100")
: GUIウィンドウを表示します。w500 h100
で幅500ピクセル、高さ100ピクセルに設定します。ButtonAction(*)
: ボタンがクリックされたときに実行される関数です。MyGui.Submit()
でGUIコントロールの内容を取得し、oSaved.s_Word
でEditコントロールの内容を取得してメッセージボックスに表示します。(*)
はパラメータを受け取ることを示していますが、ここでは使用していません。GuiClose(GuiObj)
: GUIウィンドウが閉じられたときに実行される関数です。GuiObj.Destroy()
でGUIオブジェクトを破棄し、MyGui := ""
でグローバル変数を空文字列に設定します。これにより、メモリリークを防ぎます。
スクリプトの実行
スクリプトを保存後、Ctrl + Shift + Gを押すとGUIが表示されます。テキストボックスに文字を入力し、「ボタン」をクリックすると、入力した文字列がメッセージボックスに表示されます。
ポイント:
global
キーワードの適切な使用: ホットキーサブルーチン内でグローバル変数を使用する場合は、サブルーチンの先頭でglobal
キーワードを使って明示的に宣言する必要があります。- GUIオブジェクトの遅延生成: GUIオブジェクトの生成は、実際にGUIを表示する必要があるまで遅延させることで、不要なオブジェクトの生成を防ぎ、スクリプトの効率を高めます。
OnEvent
によるイベントハンドリング:OnEvent
メソッドを使用することで、GUIコントロールのイベント(クリック、クローズなど)に対する処理を簡単に記述できます。
(応用編)Ctrl+Fの検索機能を拡張するGUIのサンプルスクリプト
Windowsの多くのアプリケーションはCtrl + Fのショートカットキーで検索機能が有効になります(「F」はFindの頭文字ですね)。このショートカット機能を拡張して、Ctrlを押下しながらFキーを2連続押下するとGoogle検索に遷移できるGUIを立ち上げるホットキーを作ってみましょう。
またGUI画面のサイズやボタン数は自由に設定できますので、ランチャーの役割も担う事が出来ます。ランチャーソフトを使用している方は、今後はAutoHotkeyに一本化してはいかがでしょうか。

次のソースを.ahkファイルに張り付けてください。
; 例えばa::Send "a" はループになるが、このようなHotKeyのループを防ぐディレクティブ
#UseHook true
; グローバル変数
global SearchWord := ""
global SearchGui := ""
global clip :=""
;;;;;;;;;;; Hotkey 検索用Gui表示 ;;;;;;;;;;;;;;
^f::
{
KeyWait("f") ; キー押し上げを待つ
if (KeyWait("f", "D T0.2")=0) { ; キー押し下げをT秒待ちTimeOutは0(偽)を、そうでないなら 1(真)を返す
Send("^f")
} ;2回目押下無しは、通常通り Send "^f"
else { ;2回目押下有りは、検索用Gui立ち上げ
SearchInput() ;Guiの入力画面立ち上げ
}
}
;;;;;;;;;;; Function 検索用Gui表示 ;;;;;;;;;;;;;;
SearchInput()
{
global
; GUIは多重起動防止
If (WinActive("AHK_SearchBox") ) {
return
}
SearchWord := ""
ClipSaved := ClipboardAll()
A_Clipboard := ""
Send("^c")
ClipWait(0.2) ;ClipWaitがなく反転がない状態でGUIを開くと処理が止まる。
if (StrLen(A_Clipboard) = 0) {
;IMEが変更できない領域では、反転していない単語を自動で取得する処理は行わない。例:YouTubeなどで左右の移動が影響する為。
IMEtmp := IME_GET()
if (IMEtmp = 1) {
IME_SET(0) ;英語入力
}
else if (IMEtmp = 0) {
IME_SET(1) ;日本語入力
}
else {
MsgBox("SearchIME Error!")
}
Sleep(50)
if (IMEtmp = IME_GET()) {
; msgbox "This area is not available for automatic word selection. Please invert the search text."
}
else {
Send("^{Right}")
Sleep(10) ;Sleepがないと、次の選択がスキップする事がある。
Send("^+{Left}")
Sleep(20) ;選択後にSleepないと、クリップボードへのコピーが失敗する事がある。
Send("^c")
Errorlevel := !ClipWait(1.0) ;0.5だとメモ帳でコピーができない事がある。
}
IME_SET(IMEtmp)
}
clip := A_Clipboard
clip := rm_crlf(clip)
clip := RegExReplace(clip, ">|`"", "") ; "パスやURL全体を()や'でくくっている事もあるので変換したいが、ファイル名に含まれている事もあるのでやめる。'
clip := RegExReplace(clip, "[.']$", "") ;
tmp := InStr(clip, "http")
if (tmp > 0) {
clip := SubStr(clip, (tmp)<1 ? (tmp)-1 : (tmp))
}
tmp := InStr(clip, "\\")
if (tmp > 0) {
clip := SubStr(clip, (tmp)<1 ? (tmp)-1 : (tmp))
}
tmp := InStr(clip, "c:\")
if (tmp > 0) {
clip := SubStr(clip, (tmp)<1 ? (tmp)-1 : (tmp))
}
tmp := InStr(clip, "z:\")
if (tmp > 0) {
clip := SubStr(clip, (tmp)<1 ? (tmp)-1 : (tmp))
}
clip := Trim(clip)
If (Strlen(clip) = 0) { ;選択文字がない状態で、ペーストしたい場合を考慮
A_Clipboard := ClipSaved
}
ClipSaved := ""
if IsObject(SearchGui)
{
SearchGui.Destroy() ;途中でエラーになるとGUI情報がメモリに残り次の検索でもエラーになるためDestoryを記載。
}
SearchGui := Gui()
SearchGui.OnEvent("Close", GuiEscape)
SearchGui.OnEvent("Escape", GuiEscape)
; GuiのAddメソッドの様々なオブションについては、以下のリンクを参照
; https://ahkscript.github.io/ja/docs/v2/lib/Gui.htm#Add
gcEditSearchWord := SearchGui.Add("Edit", "vSearchWord w880 R2 -WantReturn", clip)
gcSearchButtonGoogle := SearchGui.Add("Button", "Default Section", "Search") ;第1引数:コントロールタイプ ("Button") 第2引数: オプション(変数名を設定する"v"オプションなど)第3引数: ボタンのテキスト
gcSearchButtonGoogle.OnEvent("Click", SearchButtonGoogle) ;Default Selectionは、Enterで実行されるボタンであり、ボタンが選択状態になるわけではない。
gcSearchButtonEng := SearchGui.Add("Button", "ys vSearchEng", "SearchEng") ;ysは、ボタンの位置を調整するための指定
gcSearchButtonEng.OnEvent("Click", SearchButtonEng)
SearchGui.Title := "AHK_SearchBox "
SearchGui.Show("Center w900")
If (Strlen(clip) != 0 and WinActive("AHK_SearchBox") ) { ;WinActiveは、GUIが消えた後に、次のsend が入らないように。
Send("{tab}")
}
}
;;;;;;;;;;; Function Google検索 and Explorer表示 ;;;;;;;;;;;;;;
SearchButtonGoogle(*)
{
global
try {
oSaved := SearchGui.Submit()
SearchWord := oSaved.SearchWord
if ( SubStr(SearchWord, 1, 1) = "\" or SubStr(SearchWord, 1, 3) = "c:\" or SubStr(SearchWord, 1, 3) = "z:\") {
if (FileExist(SearchWord) or (SubStr(SearchWord, -2) != "\" && FileExist(SearchWord . "\"))) { ; ディレクトリチェックを追加
Run(SearchWord)
} else {
MsgBox("No Exist: " SearchWord)
}
}
else if SubStr(SearchWord, 1, 4) = "http" {
Run(SearchWord)
}
else {
Run("http://www.google.co.jp/search?hl=ja&lr=lang_ja&ie=UTF-8&q=" SearchWord)
}
}
catch as e {
MsgBox(e.message, "", 16)
}
GuiEscape()
A_Clipboard := SearchWord
}
;;;;;;;;;;; Function Web英語サイト検索 ;;;;;;;;;;;;;;
SearchButtonEng(*)
{
global
try {
oSaved := SearchGui.Submit()
SearchWord := oSaved.SearchWord
;検索 英単語
clipLength := StrLen(SearchWord)
If (clipLength <= 1) {
MsgBox("Too short serch word: " SearchWord " length:" clipLength)
} else {
Run("`"https://ejje.weblio.jp/content/" SearchWord "`"")
}
}
catch as e {
MsgBox(e.message, "", 16)
}
GuiEscape()
A_Clipboard := SearchWord
}
;;;;;;;;;;; Function Guiエスケープ ;;;;;;;;;;;;;;
GuiEscape(*) { ; 引数はアスタリスクで定義
global
SearchGui.Destroy()
}
;;;;;;;;;;; Function 改行コード・全角スペース除去 ;;;;;;;;;;;;;;
rm_crlf(str) {
str := RegExReplace(str, "\n", "")
str := RegExReplace(str, "\r", "")
str := RegExReplace(str, " ", "")
str := Trim(str)
Return str
}
;;;;;;;;;;; Function IME ;;;;;;;;;;;;;;
; IME_GETとIME_SETは、eamat様のIME制御ライブラリIME.ahkから抜粋
; https://w.atwiki.jp/eamat/pages/17.html
;-----------------------------------------------------------
; IMEの状態の取得
; WinTitle="A" 対象Window
; 戻り値 1:ON / 0:OFF
;-----------------------------------------------------------
IME_GET(WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("DWORD", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x0005 ;wParam : IMC_GETOPENSTATUS
, "Int", 0) ;lParam : 0
}
;-----------------------------------------------------------
; IMEの状態をセット
; SetSts 1:ON / 0:OFF
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("Uint", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint",stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x006 ;wParam : IMC_SETOPENSTATUS
, "Int", SetSts) ;lParam : 0 or 1
}
スクリプトの実行
Ctrl+Fキーを1回押下すると通常の検索ショートカットとして機能しますが、Ctrl+Fキーの2連打でGUIを起動します。
ホットキー2連打の手法は様々な場面で使えるテクニックですので、是非覚えてください。
スクリプトの解説
- グローバル変数
SearchWord
: 検索文字列を格納します。SearchGui
: 検索GUIオブジェクトを格納します。clip
: クリップボードの内容を一時的に格納します。
- ホットキー (
^f
)KeyWait("f")
:f
キーが離されるまで待ちます。if (KeyWait("f", "D T0.2")=0)
:f
キーが0.2秒以内に再度押されたかどうかをチェックします。D
はキーダウン、T0.2
はタイムアウト0.2秒を意味します。- 2回押されていない場合 (
=0
) は、通常のCtrl + f
(Send "^f"
) を実行します。 - 2回押された場合 (
else
) は、SearchInput()
関数を呼び出して検索GUIを起動します。
SearchInput()
関数 (検索GUI表示)- GUIの多重起動を防ぎます (
If (WinActive("AHK_SearchBox") ) { return }
)。 SearchWord
を空にします。- クリップボードの内容を一時保存し (
ClipSaved := ClipboardAll()
)、クリップボードを空にします (A_Clipboard := ""
)。 Send("^c")
で選択テキストをクリップボードにコピーします。ClipWait(0.2)
でクリップボードへのコピーが完了するのを待ちます。これは、GUIを開く前にクリップボードの内容が確実に取得できるようにするためです。- クリップボードが空の場合(IMEが影響している場合などを考慮)、IMEの状態を取得し、必要に応じて変更して再度テキストの取得を試みます。これは、IMEがオンになっていると、選択テキストがクリップボードにコピーされない場合があるためです。
- 取得したテキストを
clip
に格納し、不要な文字(改行、全角スペース、>
、"
など)を削除します。また、http
、\\
、c:\
、z:\
で始まる文字列の場合は、それ以降の文字列を抽出します。 - クリップボードに何もコピーされていない場合は、保存しておいた元のクリップボードの内容を復元します。
- GUIオブジェクトを作成し、イベントハンドラを設定します。
OnEvent("Close", GuiEscape)
: GUIが閉じられたときの処理。OnEvent("Escape", GuiEscape)
: Escapeキーが押されたときの処理。
Edit
コントロールに取得したテキストを初期値として設定します。Button
コントロールを作成し、クリックイベントにSearchButtonGoogle
関数を割り当てます。- GUIを表示します。
- テキストが入力されている場合は、
Tab
キーを送信してEditコントロールにフォーカスを当てます。
- GUIの多重起動を防ぎます (
SearchButtonGoogle()
関数 (Google検索実行)- GUI入力ボックスの検索文字列を取得します。
- 検索文字列が
\
、c:\
、z:\
で始まる場合は、ファイルパスとみなし、ファイルまたはディレクトリを開きます。 - 検索文字列が
http
で始まる場合は、URLにアクセスします。 - 上記以外の場合は、Google検索を実行します。
- エラーが発生した場合は、メッセージボックスを表示します。
GuiEscape()
関数を呼び出してGUIを閉じます。- 検索文字列をクリップボードにコピーします。
SearchButtonEng()
関数 (英語サイト検索実行)- GUIから入力された検索文字列を取得します。
- 英単語サイトWeblio 翻訳を検索します。
GuiEscape()
関数 (GUIクローズ)- GUIオブジェクトを破棄します。
rm_crlf()
関数 (改行コード・全角スペース除去)- 文字列から改行コード (
\n
,\r
) と全角スペース () を削除します。
- 文字列から改行コード (
IME_GET()
とIME_SET()
関数 (IME制御)- IMEの状態を取得 (
IME_GET()
) および設定 (IME_SET()
) します。これは、eamat氏のIME制御ライブラリから抜粋されたものです。
- IMEの状態を取得 (
まとめ
AutoHotkeyを使えば、ホットキーで呼び出せる実用的なGUIを簡単に作成できます。上記例を見るだけでも、日常の作業を効率化するアイディアが浮かんできたのではないでしょうか。
AutoHotkeyは単なるキーマッピングツールではなく、外部プログラムもコールできる強力なプログラム実行環境です。この機会にAutoHotkeyであなたのルーチンワークを自動化してみてはいかがでしょうか。