5

私は自分のAutoHotKeyスクリプトを書くのは初めてなので、これは私がここで見逃している愚かなことであるに違いありません。

スクリプトの目的は、ユーザーがテキストを選択してホットキー(Win- W)を押すことです。メニューがポップアップし、メニュー項目をクリックします。選択したテキストがクリップボードにコピーされます。今私がやろうとしているのはそれだけです。

問題は、最初に機能し、次に失敗し、次に機能し、次に失敗するなどです。基本的には、1回おきにしか機能しません。

AutoHotKey_l最新(Unicode 32ビット)でWin7x64を実行しています。

にタイムアウトがありClipWait、基本的には待機し、コピーされたテキストを受信せず、ErrorLevel1を発行します。

コードは次のとおりです。

#SingleInstance force
; EXAMPLE #2: This is a working script that creates a popup menu that is displayed when the user presses the Win-w hotkey.

; Create the popup menu by adding some items to it.
Menu, MyMenu, Add, Demo, Demo

return  ; End of script's auto-execute section.

Demo:
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
Send ^c
ClipWait, 2  ; Wait for the clipboard to contain text.
if ErrorLevel = 1
{
    MsgBox Copy failed
}
else
{
    MsgBox Copy worked
}
return

#w::Menu, MyMenu, Show  ; i.e. press the Win-w hotkey to show the menu.

どんな助けでも大歓迎です。

4

1 に答える 1

8

散発的に、および/または他のプログラムで異なる動作をするスクリプトがある場合
、最初に試すことは、キーを押す時間やキー間の遅延時間をシミュレートすることです。
これは、一部のプログラムがAutoHotkeyが
人工的なキーストロークを送信する速度を処理するように設計されていないためです。

最も基本的な例は次のとおりです。

f1::
Send, {ctrl down}
Sleep, 40
Send, {c down}
Sleep, 40
Send, {c up}
Sleep, 40
Send, {ctrl up}
Return

より簡潔にする方法はいくつかあります。
最も簡単な(スリープとは異なり、遅延中にブロックされるため、常に望ましいとは限りません)コマンド
SetKeyDelay、SendEventモードとSendPlayモードでのみ機能します。

f2::
SetKeyDelay, 40 ; could be set at the top of the script instead.
Send, {ctrl down}{c down}{c up}{ctrl up}
Return 

AHK_Lを使用している場合は、forループと配列を使用できます。

f3::
For i, element in array := ["{ctrl down}","{c down}","{c up}","{ctrl up}"] {
   Sendinput, %element%
   Sleep, 40
} Return

そして、AHKベーシック(またはAHK_L)を使用している人は以下を使用できますLoop, Parse

f4::
list := "{ctrl down},{c down},{c up},{ctrl up}"
Loop Parse, list, `,
{
    Sendinput, %A_LoopField%
    Sleep, 40
} Return 

3つのSendmodeについて読むと便利です。
詳細については、送信コマンドのページの下部にあります。

于 2012-04-12T19:55:04.540 に答える