Autohotkey 自动热键剪贴板变量永久保存值?

Autohotkey 自动热键剪贴板变量永久保存值?,autohotkey,Autohotkey,我有下面的简单代码,它在字符之间以15毫秒的延迟发送剪贴板中文本的击键(我使用它遍历巨大的treeview元素列表) 问题:如果我已将“text1”复制到剪贴板,后跟“text2”,则此脚本将输出“text1text2”,而不是单独输出“text2” 如果我重新加载脚本,它会打印“text2” 下面的代码中是否有错误,或者在Autohotkey 1.1.14.03中实现%clipboard%时是否存在错误 #v:: textToType=" " textToType=%clipboard% Lo

我有下面的简单代码,它在字符之间以15毫秒的延迟发送剪贴板中文本的击键(我使用它遍历巨大的treeview元素列表)

问题:如果我已将“text1”复制到剪贴板,后跟“text2”,则此脚本将输出“text1text2”,而不是单独输出“text2”

如果我重新加载脚本,它会打印“text2”

下面的代码中是否有错误,或者在Autohotkey 1.1.14.03中实现%clipboard%时是否存在错误

#v::
textToType=" "
textToType=%clipboard%
LoopCount:=StrLen(textToType)
;StringLen, LoopCount, textToType
Array%LoopCount%:=textToType
loop %LoopCount%
{
theChar:=Array%A_Index%
Send %theChar%
sleep 15
}
return
更新:感谢您指出更聪明的方法,但我仍然想找出上面代码中的错误

更新2: 错误在于我对AHK语法的理解<代码>数组%LoopCount%:=textToType将textToType中的整个字符串值分配给名为“Array”的字符串数组的(LoopCount)th元素

更新3: (感谢@John Y的澄清)

实际上,在传统意义上根本没有“声明的”数组。您只需要一组单独的变量,根据需要动态创建,这些变量的名称末尾正好有数字。Array1和Array2不是某些数组对象中的元素。它们只是两个完全独立的变量。AutoHotkey提供了一种将数字粘贴到名称末尾的方法,因此您可以像使用数组一样使用它们

保持简单

#v::
loop Parse, Clipboard
{
    Send %A_LoopField%
    sleep 15
}
return

脚本无法正常工作的原因是,您使用的是存储剪贴板中的不同单词

我已经对您的代码进行了注释,以解释它的功能:

#v::
    textToType  := "" ; Empty variable
    textToType  := Clipboard ; Move clipboard into variable

    ; Get lenght of the word
    ; Used as array index / loop count
    LoopCount := StrLen(textToType)

    ; Put the clipboard in an array at index 'LoopCount'
    Array%LoopCount% := textToType

    ; Loop through the array as many times
    ; as the string is long
    Loop % LoopCount
    {
        ; Retrieve the word at this index in the array
        theChar := Array%A_Index%
        ; Send the whole word
        Send, % theChar
        sleep 15
    }
return
不是一次发送每个字符,而是从
数组中的特定索引发送整个单词

假设你复制了“龙”这个词,这个词有6个字母长。因此,将其放入
数组6
,然后使用相同的变量在数组中循环6次。在这一点上,循环将一次获取每个索引并将其移动到CHAR中。在循环的第6圈,你将
Array6
放入
char
中,然后立即打印整个单词

然后复制单词
Stackoverflow
。这将进入
数组13
,我们将循环13次。在第6圈,我们将打印出
Dragon
,它位于
Array6
,然后继续打印,直到我们到达13,在那里我们将打印
Stackoverflow
,因为它位于
Array13

这就是为什么你的脚本没有达到你想要的效果。希望这有点帮助


请参阅代码示例,这是实现您想要做的事情的正确方法

在AHK中执行剪贴板分配时一定存在错误。对于下面的代码,AHK的行为是每次访问
dir
的值时,AHK都从剪贴板中获取最新的值,而不是在激活脚本时获取
dir
的值

; Remove all CR+LF's from the clipboard contents:
dir = %clipboard%
sleep 100
dir := StrReplace(dir, "`r`n")
编辑: 为了解决这个问题,我在剪贴板分配代码之前添加了1秒睡眠:

sleep 1000
; Remove all CR+LF's from the clipboard contents:
dir = %clipboard%
dir := StrReplace(dir, "`r`n")
100毫秒的睡眠似乎不起作用


访问
dir
的值现在只给出激活时最后一次剪贴板分配的值。

我真的不理解你的解释。如果它一次打印整个字符串,它将打印相同的完整“循环计数”次数。变量赋值和“Send”在同一个循环中,在大括号内。(我同意我是AHK的新手,阅读手册和编写代码需要2分钟,但这些都是基本的通用编程规则)@dbza:我想如果你用手(比如说用铅笔和纸)反复执行代码,你会理解得更好。当你得到一个变量时,用实际值填充它。请注意,在循环迭代1中,除非刚刚存储的单词长度为1个字符,否则该迭代不会打印任何内容,因为Array1不存在。在西多拉的例子中,Array2也不存在。仅存在阵列6和阵列13。您的代码根据输入长度存储数组元素,循环打印每个元素,从最短到最近保存的长度。谢谢大家。事实上,2分钟的匆忙阅读手册是我的问题。我认为数组%LoopCount%:=textToType的意思类似于声明一个包含LoopCount元素的字符数组,并在字符串textToType中赋值。实际上,它创建了一个字符串数组,并将textToType放入第n个字符串元素(LoopCount)。我需要进一步熟悉语法。@dbza:实际上,在传统意义上根本没有“声明”数组。您只需要一组单独的变量,根据需要动态创建,这些变量的名称末尾正好有数字
Array1
Array2
不是某些
Array
对象中的元素。它们只是两个完全独立的变量。AutoHotkey提供了一种将数字粘贴到名称末尾的方法,因此您可以像使用数组一样使用它们。在查看数组上的自动热键文档时,请特别注意“关联数组”和“伪数组”之间的区别。您使用的是伪数组。非常感谢@JohnY!我可能在关于数组的手册页面中遗漏了这些基本信息,或者根本没有这些信息。只是查找了一下,但有人能告诉我的原始代码是什么吗?