AutoHotkeyを通常の方法でインストールできないときは、AutoHotkeyのインストール方法をご覧ください。
通常、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
を実行して、デフォルトレジストリ値を修復する必要がある場合もあります。
以下のように、この問題には様々なバリエーションがあります:
オペレーティングシステムを変更した場合、他のものも変更されている可能性があり、スクリプトに影響を及ぼしている可能性があります。例えば、パソコンを新しくした場合、ドライバーやその他のソフトウェアが異なるものがインストールされていることがあります。また、AutoHotkeyの新しいバージョンにアップデートした場合は、以前使用していたバージョンを確認し、変更履歴と 互換性ノートを確認してください。
また、次の質問も参考にしてください:
デフォルトでは、ユーザーアカウント制御(UAC)は、「昇格」プログラム(つまり、管理者として実行されているプログラム)が、非昇格プログラムによってセキュリティ制限を回避できるようにするため、自動化から保護します。ホットキーもブロックされるため、例えば、昇格していないプログラムが昇格したプログラム向けの入力を盗み見ることはできない。
また、UACによりSendPlayや BlockInputが動作しない場合があります。
一般的な回避策は以下の通りです:
トレイアイコンを取り戻すには、スクリプトのエラーを修正する必要があります。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"の部分が隠されている場合がありますが、ファイルには次のようなアイコンが表示されます
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ビットプログラムにのみ表示される仮想ディレクトリです。
回答:スクリプトの文字コードを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で保存する必要があります。
すべてのゲームでAHKがキーやクリックを送信したり、ピクセルカラーを受信したりできるわけではありません。
しかし、いくつかの選択肢がありますので、以下に挙げるすべての解決策を試してみてください。これらすべてがダメな場合、AHKがあなたのゲームに取り組むことは不可能かもしれません。ゲームにはGameGuardやHackshieldといったハックやチート防止対策が施されていることがあります。その場合、AutoHotkeyはそのゲームでは動作しない可能性が高いです。
SendPlay関数、SendMode Play、および/または、ホットストリングオプションSPを使用して、SendPlayを使用します。
SendPlay "abc"
SendMode "Play" Send "abc"
:SP:btw::by the way ; または #Hotstring SP ::btw::by the way
注意:ユーザーアカウント制御が有効な場合、スクリプトが管理者として実行されていても、SendPlayが全く効果を発揮しない場合があります。
SetKeyDelayの増加。事例:
SetKeyDelay 0, 50 SetKeyDelay 0, 50, "Play"
他の送信モードに失敗した場合に有効な場合があるControlSendをお試しください:
ControlSend "abc",, GameTitle
キーのダウン、アップのイベントを各種送信方法で試してみる:
Send "{KEY Down}{KEY Up}"
スリープを挟んだキーのダウンとアップのイベントを試してみてください:
Send "{KEY down}" Sleep 10 ; 様々なミリ秒を試してみてください。 Send "{KEY up}"
CPUに大きな負荷がかかっているときに、スクリプトのHotkey、Click、Sendが通常より明らかに遅くなる場合は、スクリプトのプロセス優先度を上げると改善する場合があります。そのためには、スクリプトの先頭付近に以下の行を記述します:
ProcessSetPriority "High"
確かにそのファイルが感染している可能性はありますが、多くの場合、これらの警告はウイルス対策プログラムが勘違いしていることを意味する偽陽性です。よくある提案として、virustotalや Jottiなどのオンラインサービスにファイルをアップロードして、他のアンチウイルスプログラムの意見を聞いてみるというものがあります。疑わしい場合は、ウイルス対策ソフトのベンダーにファイルを送信して確認してもらうとよいでしょう。ベンダーが誤検出であることを確認し、AutoHotkeyとうまく連携できるように製品を修正するかもしれないので、これは私たちや他のAutoHotkeyユーザーにとっても役立つかもしれません。
UPX(AutoHotkey 1.0のデフォルト、1.1は不可)やMPRESS(AutoHotkey 1.1のオプション)など、圧縮されているコンパイル済みスクリプトでは、誤検出がより一般的になるかもしれません。AutoHotkeyのデフォルトインストールにはコンプレッサーが含まれていないため、コンパイルされたスクリプトはデフォルトで圧縮されません。
AutoHotkeyのダウンロードページをご覧ください。
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
このスクリプトを作ったのはラジャットです。
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の自動化を参照してください。
以下はその一例です。
Editのサンプルセクションには、デフォルトのエディタを変更するためのスクリプトがあります。
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 }
GDI+標準ライブラリby ticをご覧ください。Guiを使った初歩的な方法でも可能ですが、限定的な方法です。
WinWait、WinWaitClose、WinWait[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を起動するたびにスクリプト(または任意のプログラム)が自動的に起動するようにするには、いくつかの方法があります。最も簡単なのは、スタートアップフォルダにスクリプトのショートカットを配置することです:
shell:startup
」と入力して「OK」または「Enter」をクリックします。これにより、現在のユーザーのスタートアップフォルダが開かれます。代わりに全ユーザーのフォルダを開くには、shell:common startup
と入力します(ただし、この場合は管理者でないと進めません)。マウスの左右のボタンは普通に割り当てられるようにします(例えば、#LButton::
はWin+LeftButtonのホットキーです)。同様に、中ボタンとマウスホイールの回転は、ドライバがこれらのボタンを直接制御するマウスを除いて、普通に割り当てることができるはずです。
第4ボタン(XButton1)と第5ボタン(XButton2)は、マウスドライバーによってクリックがシステムから見えるようになっていれば、割り当て可能な場合があります。もし見えない場合、あるいはマウスに5つ以上のボタンがある場合、マウスに付属のソフトウェア(コントロールパネルやスタートメニューからアクセスできる場合もあります)を使って、これらのボタンを押すたびにキーストロークを送信するように設定してみてはいかがでしょうか?このようなキーストロークは、スクリプトのホットキーとして定義することができます。例えば、第4ボタンでCtrl+F1を送信するように設定すると、スクリプトで^F1::
を使って間接的にそのボタンをホットキーとして設定することができます。
第4ボタンと第5ボタンが見えない5ボタンマウスをお使いの場合は、マウスドライバーをOSに付属のデフォルトドライバーに変更してみてください。これは、あなたの特定のマウスにそのようなドライバがあり、あなたのマウスのカスタムソフトウェアによって提供される機能なしで生きることができることを前提としています。
キーの文字ではなく、キーの名前(Tab、Space)を使用します。例えば、#Space
はWin+Space、^!Tab
はCtrl+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}"
プレフィックス$は、無限ループに関する警告ダイアログを防ぐために必要です(ホットキーが「自分自身を送信」するため)。また、鍵が離された時点で上記の動作が発生します。
以下はその例です。
polyetheneによるスクリプトを使用します(例文が含まれています)。
特殊キー」を参照してください。
できます。このスクリプトの例では、000をイコールキーにします。Send "="
行を任意の行に置き換えることで、動作を変更することができます。