よくある質問(FAQ)

目次

一般的なトラブルシューティング

一般的な事項

ホットキー、ホットストリング、リマッピング

一般的なトラブルシューティング

AutoHotkeyがインストールできないときは、どうすればよいですか?

AutoHotkeyを通常の方法でインストールできないときは、AutoHotkeyのインストール方法をご覧ください。

.ahkファイルの右クリックコンテキストメニューオプションを復元するにはどうすればよいですか?

通常、AutoHotkeyがインストールされている場合、AutoHotkeyスクリプト(.ahk)ファイルを右クリックすると、以下のオプションが表示されるはずです:

注:Windows 11では、これらのオプションの一部は通常サブメニューに追いやられ、「その他のオプションを表示」を選択することでアクセスすることができます。

例えば、Open Withを使用して.ahkファイルを開くためのデフォルトプログラムを変更した場合など、これらのオプションは現在のユーザーのプロファイルの設定によって上書きされることがあります。以下のレジストリキーを削除することで、改善されます:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ahk\UserChoice

このレジストリパッチを適用するか、AutoHotkeyのインストールディレクトリからUX\reset-assoc.ahkを実行すれば上記のレジストリキーを削除できます。

また、AutoHotkeyを再インストールするか、AutoHotkeyのインストールディレクトリからUX\install.ahkを実行して、デフォルトレジストリ値を修復する必要がある場合もあります。

以前のバージョンでは動作していたのに、Windowsxxxでは私のスクリプトが動作しないのはなぜですか?

以下のように、この問題には様々なバリエーションがあります:

オペレーティングシステムを変更した場合、他のものも変更されている可能性があり、スクリプトに影響を及ぼしている可能性があります。例えば、パソコンを新しくした場合、ドライバーやその他のソフトウェアが異なるものがインストールされていることがあります。また、AutoHotkeyの新しいバージョンにアップデートした場合は、以前使用していたバージョンを確認し、変更履歴互換性ノートを確認してください。

また、次の質問も参考にしてください:

ユーザーアカウント制御(UAC)に起因する問題を回避するにはどうすればよいですか?

デフォルトでは、ユーザーアカウント制御(UAC)は、「昇格」プログラム(つまり、管理者として実行されているプログラム)が、非昇格プログラムによってセキュリティ制限を回避できるようにするため、自動化から保護します。ホットキーもブロックされるため、例えば、昇格していないプログラムが昇格したプログラム向けの入力を盗み見ることはできない。

また、UACによりSendPlayBlockInputが動作しない場合があります。

一般的な回避策は以下の通りです:

エラーで起動しないので、トレイアイコンからスクリプトを編集できません。どうすればよいですか?

トレイアイコンを取り戻すには、スクリプトのエラーを修正する必要があります。This will require locating the script and opening it in an editor by some other means than the tray icon.

If you are running an AutoHotkey executable file directly, the name of the script depends on the executable. For example, if you are running AutoHotkey32.exe, look for AutoHotkey32.ahk in the same directory. システム設定によっては、".ahk"の部分が隠されている場合がありますが、ファイルには次のようなアイコンが表示されます [H]

You can usually edit a script file by right clicking it and selecting Edit Script. それでもうまくいかない場合は、メモ帳などのエディターでファイルを開いてください。

Normally, you should create a script file (something.ahk) anywhere you like, and run that script file instead of running AutoHotkey.

コマンドラインパラメータ「スクリプトファイル名」AutoHotkey.exeの移植性についてもご覧ください。

スクリプトのエラーを見つけて修正するにはどうすればよいですか?

簡単なスクリプトについては、「スクリプトのデバッグ」を参照してください。変数の内容を表示するには、MsgBoxまたはToolTipを使用します。複雑なスクリプトについては、「インタラクティブ・デバッグ」を参照してください。

実行機能でゲームやプログラムを起動できないのはなぜですか?

プログラムによっては、独自のディレクトリで起動する必要があります(疑わしい場合は、通常、そうするのが最善です)。事例:

Run A_ProgramFiles "\Some Application\App.exe", A_ProgramFiles "\Some Application"

起動しようとしているプログラムがA_WinDir "\System32"にあり、64ビットシステムでAutoHotkey 32ビットを使用している場合、ファイルシステムリダイレクトが干渉している可能性があります。これは、A_WinDir "\SysNative"を代わりに使用; 64ビットシステム上で動作する32ビットプログラムにのみ表示される仮想ディレクトリです。

スクリプトの非ASCII文字が正しく表示されない、または送信できないのはなぜですか?

回答:スクリプトの文字コードをUTF-8、できればBOM付きで保存してください。

非ASCII文字は、選択したエンコーディングによって異なる2値で表現されます。このような文字を正しく解釈するためには、テキストエディタとAutoHotkeyが、いわば同じコードページにある必要があります。AutoHotkey v2は、すべてのスクリプトファイルのデフォルトをUTF-8に設定していますが、これは/CPコマンドラインスイッチで上書きすることができます。

It is recommended to save the script as UTF-8 with BOM (byte order mark) to ensure that editors (and maybe other applications) can determine with certainty that the file is indeed UTF-8. Without BOM, the editor has to guess the encoding of the file, which can sometimes be wrong.

メモ帳でUTF-8として保存するには、「名前を付けて保存」ダイアログの「エンコード」ドロップダウンから、UTF-8またはUTF-8 with BOMを選択します。Note that Notepad in Windows 10 v1903 and later defaults to UTF-8 (without BOM).

To read other UTF-8 files which lack a byte order mark (BOM), use FileEncoding "UTF-8-RAW", the *P65001 option with FileRead, or "UTF-8-RAW" for the third parameter of FileOpen. The -RAW suffix can be omitted, but in that case any newly created files will have a BOM.

なお、標準のINI関数でアクセスしたINIファイルはUTF-8をサポートしていませんので、ANSIまたはUTF-16で保存する必要があります。

特定のゲームでホットストリングSend関数、Click関数が動作しないのはなぜですか?

すべてのゲームでAHKがキーやクリックを送信したり、ピクセルカラーを受信したりできるわけではありません。

しかし、いくつかの選択肢がありますので、以下に挙げるすべての解決策を試してみてください。これらすべてがダメな場合、AHKがあなたのゲームに取り組むことは不可能かもしれません。ゲームにはGameGuardやHackshieldといったハックやチート防止対策が施されていることがあります。その場合、AutoHotkeyはそのゲームでは動作しない可能性が高いです。

ゲームなど、CPUに負荷がかかる場面でパフォーマンスを向上させるにはどうすればよいですか?

CPUに大きな負荷がかかっているときに、スクリプトのHotkeyClickSendが通常より明らかに遅くなる場合は、スクリプトのプロセス優先度を上げると改善する場合があります。そのためには、スクリプトの先頭付近に以下の行を記述します:

ProcessSetPriority "High"

アンチウイルスプログラムがAutoHotkeyやコンパイルされたスクリプトをマルウェアと判定しました。本当にウイルスなのでしょうか?

確かにそのファイルが感染している可能性はありますが、多くの場合、これらの警告はウイルス対策プログラムが勘違いしていることを意味する偽陽性です。よくある提案として、virustotalJottiなどのオンラインサービスにファイルをアップロードして、他のアンチウイルスプログラムの意見を聞いてみるというものがあります。疑わしい場合は、ウイルス対策ソフトのベンダーにファイルを送信して確認してもらうとよいでしょう。ベンダーが誤検出であることを確認し、AutoHotkeyとうまく連携できるように製品を修正するかもしれないので、これは私たちや他のAutoHotkeyユーザーにとっても役立つかもしれません。

UPX(AutoHotkey 1.0のデフォルト、1.1は不可)やMPRESS(AutoHotkey 1.1のオプション)など、圧縮されているコンパイル済みスクリプトでは、誤検出がより一般的になるかもしれません。AutoHotkeyのデフォルトインストールにはコンプレッサーが含まれていないため、コンパイルされたスクリプトはデフォルトで圧縮されません。

一般的な事項

公式ビルドや旧バージョンはどこで入手できますか?

AutoHotkeyのダウンロードページをご覧ください。

USBメモリからAHKを起動することはできますか?

AutoHotkey.exeの移植性を参照してください。

コマンドライン操作の出力はどのように取得できますか?

テストでは、ファイルキャッシュにより、一時ファイルが比較的小さな出力でも非常に高速に動作することが確認されています。実際、使用後すぐにファイルを削除すると、実際にはディスクに書き込まれないことが多い。事例:

RunWait A_ComSpec ' /c dir > C:\My Temp File.txt'
VarToContainContents := FileRead("C:\My Temp File.txt")
FileDelete "C:\My Temp File.txt"

一時ファイルの使用を避けるには(特に出力が大きい場合)、Run関数の例にあるように、Shell.Exec()メソッドの使用を検討します。

他のスクリプトを閉じたり、一時停止したり、中断したり、再読み込みしたりするにはどうしたらよいですか?

まず、別のスクリプトを閉じる例を紹介します:

DetectHiddenWindows True  ; スクリプトの隠されたメインウィンドウを検出できるようにします。
SetTitleMatchMode 2  ; 以下、ファイルのフルパスを指定する必要を回避することができます。
WinClose "ScriptFileName.ahk - AutoHotkey"  ; スクリプト名の大文字小文字問題を回避するためアップデート

他のスクリプトを中断一時停止再読み込みするには、上記の最後の行を次のいずれかに置き換えてください:

PostMessage 0x0111, 65305,,, "ScriptFileName.ahk - AutoHotkey"  ; サスペンド
PostMessage 0x0111, 65306,,, "ScriptFileName.ahk - AutoHotkey"  ; ボーズ
PostMessage 0x0111, 65303,,, "ScriptFileName.ahk - AutoHotkey"  ; リロード

スクリプトを終了させることなく、繰り返し動作を停止させるにはどうすればよいですか?

キーを押すだけでスクリプト全体を一時停止または再開するには、この例のようにホットキーを「一時停止」機能に割り当てます:

^!p::Pause  ; Ctrl+Alt+P を押すと一時停止します。もう一度押すと再開します。

ループ内で繰り返されるアクションを停止するには、次のような動作例を考えてみましょう。このホットキーは、それ自体が繰り返されるアクションの開始と停止の両方を行います。In other words, pressing the hotkey once will start the loop. 同じホットキーをもう一度押すと停止します。

#MaxThreadsPerHotkey 3
#z::  ; Win+Zのホットキー(このホットキーはお好みで変更してください)。
{
    static KeepWinZRunning := false
    if KeepWinZRunning  ; これは、下層のスレッドがすでに下のループを実行していることを意味します。
    {
        KeepWinZRunning := false  ; そのスレッドのループを停止させる信号を送る。
        return  ; このスレッドを終了すると、その下にあるスレッドが再開され、上の行で行われた変更を見ることができます。
    }
    ; それ以外の場合:
    KeepWinZRunning := true
    Loop
    {
        ; 次の4行は、繰り返したい動作です(お好みで更新してください):
        ToolTip "Press Win-Z again to stop this from flashing."
        Sleep 1000
        ToolTip
        Sleep 1000
        ; しかし、以下の残りの部分は変更しないでください。
        if not KeepWinZRunning  ; 再びWin-Zを押すことでループを止める合図をした。
            break  ; このループから抜け出そう。
    }
    KeepWinZRunning := false  ; 次にこのホットキーを押すときに備えて、リセットを行います。
}
#MaxThreadsPerHotkey 1

AutoHotkeyの関数のコンテキスト依存ヘルプを、どのエディターでも使えるようにするにはどうしたらよいですか?

このスクリプトを作ったのはラジャットです。

Webページの読み込みが終了したことを検知するにはどうすればよいですか?

With Internet Explorer, perhaps the most reliable method is to use DllCall and COM as demonstrated at this archived forum thread. On a related note, the contents of the address bar and status bar can be retrieved as demonstrated at this archived forum thread.

古く、信頼性の低い方法:以下の例の手法は、ほとんどのページでMS Internet Explorerで動作します。他のブラウザでも同様の手法が使えるかもしれません:

Run "www.yahoo.com"
MouseMove 0, 0  ; ステータスバーに "Done"の代わりにマウスホバーリンクが表示されないようにします。
WinWait "Yahoo!- "
WinActivate
if StatusBarWait("Done", 30)
    MsgBox "The page is done loading."
else
    MsgBox "The wait timed out or the window was closed."

日付や時刻を比較したり、操作したりするにはどうすればよいですか?

DateAdd関数は、YYYYMMDDHH24MISS形式の時間文字列に、日、時間、分、秒の数量を追加または減算することができます。次の例は、指定した時間から7日間を差し引いたものです:

Result := DateAdd(VarContainingTimestamp, -7, "days")

2つの日付や時刻の間の時間量を求めるには、例を挙げたDateDiffを参照してください。また、組み込み変数A_Nowには、現在のローカルタイムが格納されています。最後に、いくつかの組み込み日付/時刻変数と、カスタム日付/時刻文字列を作成するためのFormatTime関数があります。

現在の日付や時刻を送信したいのですが、どうすればよいですか?

日付と時刻にはFormatTimeまたは組み込み変数を使用します。

アクティブでない、または表示されていないウィンドウにテキストを送信するにはどうしたらよいですか?

ControlSendを使用します。

Winampがアクティブでないときでもコントロールできるようにするには?

Winampの自動化を参照してください。

MsgBoxのボタン名を変更するにはどうすればよいですか?

以下はその一例です。

コンテキストメニューやトレイアイコンからアクセスできるデフォルトのエディターを変更したいのですが?

Editのサンプルセクションには、デフォルトのエディタを変更するためのスクリプトがあります。

GUIコントロールの内容を保存したいのですが、どうすればよいですか?

Gui.Submitを使用します。事例:

MyGui := Gui()
MyGui.Add("Text",, "Enter some Text and press Submit:")
MyGui.Add("Edit", "vMyEdit")
MyGui.Add("Button",, "Submit").OnEvent("Click", Submit)
MyGui.Show

Submit(*)
{
    Saved := MyGui.Submit(false)
    MsgBox "Content of the edit control: " Saved.MyEdit
}

AHKで何か描けますか?

GDI+標準ライブラリby ticをご覧ください。Guiを使った初歩的な方法でも可能ですが、限定的な方法です。

ウィンドウが表示されたり、閉じたり、[in]アクティブになったときに、アクションを開始するにはどうしたらよいですか?

WinWaitWinWaitCloseWinWait[Not]Activeを使用してください。

There are also user-created solutions such as OnWin.ahk and [How to] Hook on to Shell to receive its messages on the archived forum.

ホットキー、ホットストリング、リマッピング

PCを起動するたびに、ホットキーやホットストリングを自動的に有効にするにはどうすればよいですか?

PCを起動するたびにスクリプト(または任意のプログラム)が自動的に起動するようにするには、いくつかの方法があります。最も簡単なのは、スタートアップフォルダにスクリプトのショートカットを配置することです:

  1. スクリプトファイルを探し、選択し、Ctrl+Cを押します。
  2. Win+Rを押して「ファイル名を指定して実行」ダイアログを開き、「shell:startup」と入力して「OK」または「Enter」をクリックします。これにより、現在のユーザーのスタートアップフォルダが開かれます。代わりに全ユーザーのフォルダを開くには、shell:common startupと入力します(ただし、この場合は管理者でないと進めません)。
  3. ウィンドウ内で右クリックし、「ショートカットの貼り付け」をクリックします。これで、スクリプトへのショートカットがスタートアップフォルダに入るはずです。

マウスのボタンがホットキーとして機能しないので困っています。何かアドバイスはありますか?

マウスの左右のボタンは普通に割り当てられるようにします(例えば、#LButton::Win+LeftButtonのホットキーです)。同様に、中ボタンとマウスホイールの回転は、ドライバがこれらのボタンを直接制御するマウスを除いて、普通に割り当てることができるはずです。

第4ボタン(XButton1)と第5ボタン(XButton2)は、マウスドライバーによってクリックがシステムから見えるようになっていれば、割り当て可能な場合があります。もし見えない場合、あるいはマウスに5つ以上のボタンがある場合、マウスに付属のソフトウェア(コントロールパネルやスタートメニューからアクセスできる場合もあります)を使って、これらのボタンを押すたびにキーストロークを送信するように設定してみてはいかがでしょうか?このようなキーストロークは、スクリプトのホットキーとして定義することができます。例えば、第4ボタンでCtrl+F1を送信するように設定すると、スクリプトで^F1::を使って間接的にそのボタンをホットキーとして設定することができます。

第4ボタンと第5ボタンが見えない5ボタンマウスをお使いの場合は、マウスドライバーをOSに付属のデフォルトドライバーに変更してみてください。これは、あなたの特定のマウスにそのようなドライバがあり、あなたのマウスのカスタムソフトウェアによって提供される機能なしで生きることができることを前提としています。

TabとSpaceをホットキーとして定義する方法は?

キーの文字ではなく、キーの名前(Tab、Space)を使用します。例えば、#SpaceWin+Space^!TabCtrl+Alt+Tabです。

キーやマウスのボタンを別のキーになるようにリマップするにはどうすればよいですか?

これについては、リマッピングのページで説明しています。

キーやボタンの二度押しを検出するにはどうすればよいですか?

ホットキーには、以下のように組み込み変数を使用します:

~Ctrl::
{
    if (ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
        MsgBox "double-press"
}

ホットキーホットストリングを特定のプログラム専用にするにはどうすればよいですか?つまり、特定のウィンドウがアクティブなとき以外は、あるキーが通常通り動作するようにしたいのです。

好ましいのは「#HotIf」です。事例:

#HotIf WinActive("ahk_class Notepad")
^a::MsgBox "You pressed Control-A while Notepad is active."

プレフィックスキーが何もしないのではなく、本来の機能を発揮させるためにはどうしたらいいのでしょうか?

Numpad0をプレフィックスキーにする、次の例を考えてみましょう:

Numpad0 & Numpad1::MsgBox "You pressed Numpad1 while holding down Numpad0."

さて、Numpad0が上記のようなホットキーの起動に使われなかったときは、いつでも本物のNumpad0のキーストロークを送るようにするには、以下のホットキーを追加してください:

 $Numpad0::Send "{Numpad0}"

プレフィックス$は、無限ループに関する警告ダイアログを防ぐために必要です(ホットキーが「自分自身を送信」するため)。また、鍵が離された時点で上記の動作が発生します。

Win+U(ユーティリティマネージャ)やWin+R(ファイル名を指定して実行)など、Windowsに内蔵されているショートカットキーを変更したり無効にしたりするには、どうしたらよいですか?

以下はそのです。

Hotstringsでワイルドカードや正規表現を使用することはできますか?

polyetheneによるスクリプトを使用します(例文が含まれています)。

キーボードレイアウトにないホットキーを使うにはどうしたらいいですか?

特殊キー」を参照してください。

私のキーパッドには、特別な000キーがあります。ホットキーにすることは可能なのでしょうか?

できます。このスクリプトの例では、000をイコールキーにします。Send "="行を任意の行に置き換えることで、動作を変更することができます。