AutoHotkey中Send发送字符串乱序的原因排查
问题:AutoHotkey v2循环发送文本行时出现内容顺序错乱
我用以下AutoHotkey v2脚本读取文本文件并循环发送每行内容:
#Requires AutoHotkey v2.0+ TextToSend := FileRead("textToSend.txt") lines := StrSplit(TextToSend, "\n") :*:st::{ Loop { SetKeyDelay 10000 Send(lines[A_Index]) Send, {Enter} Sleep 10000 } }
原本运行正常,但现在发送的字符串出现顺序错乱。比如原行内容:
abcdefghijkmnopqrstuvwxyz
发送后变成:
abcdhijkmnopqrstuvwxyzefg
实际发送的文本文件前5行输出内容如下:
52m NGUYỄN THỊ TRANG 73 | PL 17/4/2024 | 8 A 4 Đông Nhì, Lái Thiêu, Thuận An, Bình Dương | 203 | 8 A 4 Đông Nhì, Lái Thiêu, Thuận An, Bình Dương | 7.281.533đ | Na Khu Chế Xuất Linh Trung 2, Bình Chiểu, Thủ Đức, Hồ Chí Minh | 0824831562 ChochNGUYNTHT, Công ty Tài chính Ngân hàng Việt Nam Thịnh Vượng SMBC FC liên lạc để nhắc nhở về khoản vay có số hợp đồng là 20220717-2950586 của chị đến hạn cần thanh toán. Chị có thể thanh toán qua các điểm thu hộ toàn quốc như bưu điện, Thế Giới Di Động, Điện Máy Xanh, app Momo, v.v. Chị thanh toán 3.000.000đ trước 15:00 ngày 14/11/2024. Sau thời gian trên, nếu chị chưa thanh toán, sẽ có nhân viên tiếp tục liên lạc gửi thư báo từ công ty về địa chỉ của chị. Vui lòng thanh toán đúng hạn để tránh phát sinh những hệ lụy ảnh hưởng mà chị đã cam kết trong điều khoản hợp đồng.GRAN 20mBITHỊ NHỎ 76 | CRC 1/6/2023 | Bình Nhâm Tỉnh Bình Dương Tỉnh Bình Dương, ??, ??, Bình Dương | 390 | Bình Nhâm Tỉnh Bình Dương Tỉnh Bình Dương, ??, ??, Bình Dương | ∅ | Bình Nhâm, ??, ??, ?? | 0812622775 Chochị BÙI THỊ NHỎ, Công ty Tài chính Ngân hàng Việt Nam Thịnh Vượng SMBC FC liên lạc để nhắc nhở về khoản vay có số hợp đồng là 1500040018188853 của chị đến hạn cần thanh toán. Chị có thể thanh toán qua các điểm thu hộ toàn quốc như bưu điện, Thế Giới Di Động, Điện Máy Xanh, app Momo, v.v. Chị thanh toán 3.000.000đ trước 15:00 ngày 14/11/2024. Sau thời gian trên, nếu chị chưa thanh toán, sẽ có nhân viên tiếp tục liên lạc gửi thư báo từ công ty về địa chỉ của chị. Vui lòng thanh toán đúng hạn để tránh phát sinh những hệ lụy ảnh hưởng mà chị đã cam kết trong điều khoản hợp đồng. 32mVTH HƯƠNG 84 | CRC 1/10/2024 | ∅, Bình Hòa, Thuận An, Bình Dương | 180 | ∅, Bình Hòa, Thuận An, Bình Dương | 1.276.713đ | Số 96 B Phố, Định Công, Hoàng Mai, Hà Nội | 0329906019Ị
原因分析
- 换行符分割错误:使用
StrSplit(TextToSend, "\n")分割文本,但Windows系统中文本文件的换行符通常是\r\n(回车+换行),直接用\n分割会导致部分行末尾残留\r不可见字符,干扰Send的发送逻辑,引发内容错位。 - Send模式与按键延迟不兼容:
Send默认使用SendInput模式,该模式为异步发送按键,SetKeyDelay仅对SendEvent和SendPlay模式生效,对SendInput无效。当系统负载高或目标应用响应慢时,异步发送的按键易出现顺序错乱、部分按键被跳过或延迟触发的情况。 - 循环无终止条件:
Loop未设置终止逻辑,当A_Index超过lines数组长度时,lines[A_Index]返回空字符串,脚本仍会发送空内容+回车,可能干扰未完成的发送流程。
修复建议
- 修正换行符分割:使用
StrSplit(TextToSend, ["rn", "n", "r"])兼容不同系统的换行格式,避免残留不可见字符。 - 切换Send模式并确保延迟生效:改用
SendEvent或SendPlay模式,让SetKeyDelay设置生效,示例:SetKeyDelay 100, 100 ; 第一个参数为按键按下到释放的延迟,第二个为按键间的延迟 SendEvent(lines[A_Index]) - 添加循环终止条件:将
Loop改为Loop lines.Length,避免越界访问空内容:Loop lines.Length { SetKeyDelay 100, 100 SendEvent(lines[A_Index]) SendEvent("{Enter}") Sleep 10000 }
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

