2

多数のホットキーを含むスクリプトを作成しました(一般的な構造は次のとおりです)。押すと、スクリプトに含まれるすべてのホットキーとそれに対応する説明のリストが適切な形式のテーブルに表示される別のホットキーを作成したいと思います。

AutoHotkeyの出力はメッセージボックスに制限されているため、フォーマットと表示は希薄ですが、可能です。さらに問題なのは、ホットキーと対応する説明を取得することです。

ホットキーはすべて、異なる引数を使用して同じ関数を呼び出します。関数に変数を追加して、値に応じて、関数が通常のホットキーによってトリガーされたときに通常の機能を実行するか、特別な表示ホットキーからトリガーされたときに文字列などを作成することを検討しました。

スクリプトのホットキーにプログラムでアクセスする方法がまったくわかりません。A_ドキュメントを確認しましたが、この目的に使用できる変数はないようです。また、Hotkeyコマンドは適切ではありません(ホットキーが存在するかどうかをテストするために使用できますが、無数の組み合わせをループすることは、最高の、退屈な)。

失敗した試行:

  • スクリプト自体を解析するというElliotの提案を使用してみました(パスを%A_ScriptFullPath%に置き換えます。これは、生のスクリプトでは機能しますが、スクリプトのコンパイル時には機能しません。
  • スクリプトのホットキーセクション全体を継続セクションとして変数に割り当ててから、変数を解析し、Hotkeyコマンドを使用してホットキーを作成してみました。Hotkeyコマンドは宛先として任意のコマンドを取ることができず、既存のラベルを必要とするため、これは最後の部分までうまく機能しました。
  • このListHotkeysコマンドは、コントロールウィンドウにプレーンテキストとしてのみホットキーを表示するため、適用できません。

ホットキーのリストとそれに対応する引数またはコメントを表示する方法を知っている人はいますか?


スクリプト例:

SomeFunc(foobar)
{
  MsgBox %foobar%
}

         !^#A::SomeFunc("a") ; blah
 ^+NumpadMult::SomeFunc("c") ; blivet
        ^+!#`::SomeFunc("b") ; baz
      ^#Space::SomeFunc("d") ; ermahgerd
 …

必要な「出力」の例:

C+A+  W+ A   a    | C+ S+   NumpadMult  b
------------------+----------------------
C+A+S+W+ `   c    | C+   W+ Space       d

    また

Ctrl Alt Shift Win  Key         Action
-----------------------------------------
 ×    ×         ×   A           blah
 ×        ×         NumpadMult  baz
 ×    ×   ×     ×   `           blivet
 ×              ×   Space       ermahgerd

etc.
4

2 に答える 2

1

私が考えることができる唯一のことは、スクリプトの各行を個別に読んで解析することです。このコードは、スクリプト (script.ahk) を 1 行ずつ読み取り、解析します。これで始められるはずです。さらに、行を解析して修飾子も確認できます。

Loop
{
    FileReadLine, line, C:\script.ahk, %A_Index%
    if ErrorLevel
        break

    If Instr(line, "::")
    {
        StringSplit, linearray, line, ::,

        key := linearray1
        StringSplit, commandarray, linearray3, `;

        action := commandarray2

        hotkeyline := "key:  " . key . "`tAction:  " . action
        final .= hotkeyline . "`r"

    }
}
msgbox % final

return
于 2012-10-03T16:48:23.080 に答える
0

解決策を見つけました。これは完璧 (または理想的) ではなく、適切な組み込みメソッドが将来利用可能になることを願っていますが、生のスクリプトとコンパイルされたスクリプトに対しては (十分に) うまく機能します。

私がしたことFileInstallは、コンパイラーにファイルを実行可能ファイルに追加するように指示するコマンドを使用することでした (実行時にそれを抽出します)。

残念ながら、このFileInstallコマンドではソース ファイルに変数を使用できないため、単純にスクリプト自体を含めることはできません ( FileInstall, %A_ScriptFullPath%, %A_Temp%\%A_ScriptName%, 1)。

回避策として、必要なすべてのホットキーを2番目のファイルに抽出し、それをElliotが提案したように解析してから削除し#Include、スクリプトの最後にしました(ホットキーは自動実行を終了するため、最後にある必要あります)セクション)。

;;;;; Test.ahk ;;;;;

; Add hotkey file to executable and extract to Temp directory at runtime
FileInstall, Hotkeys.ahk, %A_Temp%\Hotkeys.ahk, 1

Loop
{
  ;Read a line from the extracted hotkey script and quit if error
  FileReadLine, line, %A_Temp%\Hotkeys.ahk, %A_Index%
    if ErrorLevel
      break

  ;Trim whitespace
  line=%line%

  ; Parse the line as in Elliot’s answer, but with tweaks as necessary
  ParseHotkey(line)
  …
}

FileDelete, %A_Temp%\Hotkeys.ahk ; Delete the extracted script
DisplayHotkeys()                 ; I ended up bulding and using a GUI instead
#Include, Hotkeys.ahk            ; It is included at compile-time, so no A_Temp



;;;;; Hotkeys.ahk ;;;;;

z::MsgBox foo
y::MsgBox bar
于 2012-10-12T17:42:35.630 に答える