我有以下简单的代码,它在剪贴板中发送文本的击键,在字符之间有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提供了一种将数字粘贴到名称末尾的方法,因此您可以像数组一样使用它们。
答案 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
现在仅提供激活时最后一个剪贴板分配的值。