Autohotkey剪贴板变量永远保持值?

时间:2014-10-09 21:03:05

标签: autohotkey

我有以下简单的代码,它在剪贴板中发送文本的击键,在字符之间有15ms的延迟(我使用它来遍历大量的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语法的理解。 Array%LoopCount%:=textToType将textToType中的整个字符串值分配给名为' Array'的 STRING 数组的(strong)> STRING 元素。

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

实际上,没有"宣布"传统意义上的阵列。你只需要一堆个别变量,根据需要动态创建,恰好在最后有数字的名字。 Array1和Array2不是某些Array对象中的元素。它们只是两个完全独立的变量。 AutoHotkey提供了一种将数字粘贴到名称末尾的方法,因此您可以像数组一样使用它们。

3 个答案:

答案 0 :(得分:3)

保持简单

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

答案 1 :(得分:3)

您的脚本无法正常运行的原因是因为您使用pseudo-array来存储剪贴板中的不同字词。

我已经评论了您的代码,以解释它的作用:

#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

您不是一次发送每个字符,而是从Array数组中的特定索引发送整个单词。

假设您复制单词Dragon,该单词长度为6个字母。因此,您将其放在Array6中,然后使用相同的变量将数组循环6次。此时循环将一次取每个索引并将其移动到theChar。在循环的第6圈,您将Array6放入theChar并立即打印整个单词。

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

这就是为什么你的脚本没有做你想要的事情。希望这有点帮助。

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

答案 2 :(得分:0)

在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现在仅提供激活时最后一个剪贴板分配的值。