Loops 自动热键';s循环(读取文件内容)问题与+&引用;符号

Loops 自动热键';s循环(读取文件内容)问题与+&引用;符号,loops,file-io,autohotkey,Loops,File Io,Autohotkey,关于,每次我使用这样的代码运行脚本时,都会发生一件非常奇怪的事情: ^+k:: { Gosub, MySub } Return MySub: { Send, +{Enter} Loop, read, C:\MyFile.txt { temp = %A_LoopReadLine% Send, %temp% Send, +{Enter} } } Return MyFile.txt是一个简单的文本文件,其

关于,每次我使用这样的代码运行脚本时,都会发生一件非常奇怪的事情:

^+k::
{
    Gosub, MySub
}
Return

MySub:
{
    Send, +{Enter}
    Loop, read, C:\MyFile.txt
    {   
        temp = %A_LoopReadLine%
        Send, %temp%
        Send, +{Enter}
    }
}
Return
MyFile.txt
是一个简单的文本文件,其中有时“加号”符号(
+
)与普通字母和数字一起使用

然而,尽管如此,如果我在一个空文本文件(记事本或Microsoft Word空白页)上运行热键,我看到的是每个
+
都被下划线(
)、感叹号(
)或问号(
)替换。我也看到过一个用美元符号(
$
)替换的事件

我试着在屏幕上用

MsgBox, %temp%
在发送文本之前,它完美地显示了
MyFile.txt
的原始内容。 因此,问题应该在
Send
上,而不是在文件读取上

我的文件的内容是这样的(重复了大约20行):


原因可能是什么?

找到了答案:由于从我的文件中读取的
+
符号会像按
Shift键一样发送,因此按该键可以修改输出,而不是发送文件中的原始符号

为了在不触发特殊热键的情况下发送文件的原始内容,我必须使用
SendRaw
而不是
send
,如本例所示:

^+k::
{
    Gosub, MySub
}
Return

MySub:
{
    Send, +{Enter}
    Loop, read, C:\MyFile.txt
    {   
        temp = %A_LoopReadLine%
        SendRaw, %temp%
        Send, +{Enter}
    }
}
Return

下面是一个更新版本,它使用CTRL-V而不是Send来“重新键入”数据行:

^+k::
{
    Gosub, MySub
}
Return

MySub:
{
    Send, +{Enter}
    Loop, read, C:\MyFile.txt
    {   
        temp = %A_LoopReadLine%
        Clipboard = %temp%   ; Write to clipboard
        Send, ^v+{enter}     ; Paste from clipboard
        Sleep 10             
; Short delay so it doesn't try to paste again before the clipboard has changed
; This check can get a lot more complex, but just increase it if 10 doesn't work
    }
}
Return

请发布您的文件内容。已发布(请参见上面的编辑)。很高兴看到您自己找到了sendraw命令,并且您已经报告了。同意。接受答案会更好:)哇,我很高兴你没有读到一行有
\r格式c:
:)@NelsonChan,你真的在告诉我AutoHotkey会用这样一行删除我的硬盘吗?!哇…好吧,这不是擦除计算机的完整命令,但是由于Send命令复制击键,如果你不小心参数是什么,它可能会做非常糟糕的事情。你不需要那样使用“发送”。您可以使用剪贴板并粘贴它的块。我将发布一个答案作为推荐的替代方案。
^+k::
{
    Gosub, MySub
}
Return

MySub:
{
    Send, +{Enter}
    Loop, read, C:\MyFile.txt
    {   
        temp = %A_LoopReadLine%
        Clipboard = %temp%   ; Write to clipboard
        Send, ^v+{enter}     ; Paste from clipboard
        Sleep 10             
; Short delay so it doesn't try to paste again before the clipboard has changed
; This check can get a lot more complex, but just increase it if 10 doesn't work
    }
}
Return