7

AutoHotkey コマンドHotkeyを使用すると、実行時に動的なホットキーを作成できますが、その構文とドキュメントでは組み込みまたは既存のラベル/サブルーチンに制限されているようで、あまり役に立ちません。

ホットキー、キー名 [、ラベル、オプション]

通常のハードコードされたホットキーのように機能させる方法はありますか? 例えば:

#z::MsgBox foobar        ; Typical, hard-coded hotkey pops up a message-box

Hotkey, z, MsgBox foobar ; Nope; complains about missing label “MsgBox foobar”

マニュアルの次の行により可能のように見えますが、どのように機能するかは明確ではありません。

ラベル - 通常のラベルとホットキー/ホットストリング ラベルの両方を使用できます。

4

4 に答える 4

8

これは FakeRainBrigand の回答を改良したものです。まったく同じように使用されます。

Hotkey("x", "Foo", "Bar") ; this defines:  x:: Foo("Bar")

オリジナルからの変更点:

  1. ハンドラー サブルーチンを関数に組み込むことで、偶発的なハンドラー サブルーチンの自動実行を防止します。

  2. 変数のスコープをグローバルから静的に狭めることで、名前空間の汚染を減らすことができます。hotkeys

  3. 最適化:ホットキーの定義時にfun( を使用して) 1 回だけ検索されます。Func()呼び出し時に、オブジェクト ルックアップはhotkeys2 つのオブジェクトfunsとに分割することで 4 つから 2 つに削減されましたargs

arg*これはもちろん、オブジェクト表記と可変個引数構文のために、AutoHotKey の _L バージョンに依存しています。

Hotkey(hk, fun, arg*) {
    Static funs := {}, args := {}
    funs[hk] := Func(fun), args[hk] := arg
    Hotkey, %hk%, Hotkey_Handle
    Return
Hotkey_Handle:
    funs[A_ThisHotkey].(args[A_ThisHotkey]*)
    Return
}
于 2013-07-29T19:16:00.363 に答える
7

AutoHotkeyでは、やりたいことを正確に行うことはできません。これは私が考えることができる最も近い方法です。

このファイルを呼び出してHotkeys.ahk、に入れますMy Documents/AutoHotkey/Lib。または、Libというフォルダーを作成し、メインスクリプトと同じディレクトリに配置します。

Hotkeys := {}

Hotkey(hk, fun, p*) {
    global hotkeys
    hotkeys[hk] := {}
    hotkeys[hk].fun := fun
    hotkeys[hk].p := p
    Hotkey, %hk%, HandleHotkey
}

HandleHotkey:
hotkeys[A_ThisHotkey].fun(hotkeys[A_ThisHotkey].p*)
return

これは、それを使用できるスクリプトの例です。

Hotkey("e", "msgbox", "foobar")

MsgBox(msg) {
    msgbox % msg
}

#Include <Hotkeys>

最初のパラメーターはホットキーで、2番目は呼び出す関数であり、それ以降はすべて関数に渡されます。

于 2012-10-13T17:13:22.257 に答える
0

これはあなたが探しているものですか?

#Persistent
#SingleInstance Force
#installKeybdHook

Hotkey, #z, MyLabel

MyLabel:
    MsgBox,OK
Return
于 2012-10-12T08:25:19.327 に答える