AutoHotkey在.jpg文件上无法正常工作的问题求助
问题描述
- 需求:打开.jpg图片,右键唤出热键窗口,选择数字(1/2/3)后关闭窗口,将图片的修改日期/时间、文件名与所选数字写入
Data.txt - 故障:在.jpg文件上操作时,仅将图片复制到剪贴板,无法写入文本文件;在txt文件上操作功能正常,电脑更新后出现该问题,重试旧代码和曾正常工作的图片均无效
问题根源
原代码依赖Ctrl+C获取文件路径,但在图片查看器中,Ctrl+C复制的是图片二进制内容而非文件路径,导致FileGetTime和SplitPath无法处理剪贴板中的非文本数据,进而无法完成写入操作。系统更新后,图片查看器的复制行为变化加剧了该问题。
修复后的完整代码
; 设置时区/夏令时时间修正(小时) Timecorrection = 0 ; 设置按钮对应的统计数字,将直接写入数据文件 button1 = 1 button2 = 2 button3 = 3 RButton:: if !WinExist("Image Index Script") { Gui, Destroy Gui, Show, w625 h410, Image Index Script Gui, Add, Button, x10 y192 w90 h40 gB1, %button1% Gui, Add, Button, x110 y192 w90 h40 gB2, %button2% Gui, Add, Button, x210 y192 w90 h40 gB3, %button3% Gui, Add, Button, x110 y12 w90 h40 gTEST, Test Gui, Add, Button, x210 y12 w90 h40 gRESET, Reset Gui, Add, Button, x310 y12 w90 h40 gOpenData, View Data Gui, Add, Button, x410 y12 w90 h40 gHighlight, Highlight Gui, Add, Button, x10 y12 w90 h40 gCANCEL, Cancel Gui, Add, Button, x510 y312 w90 h40 gEdit, Edit Code Gui, Add, Button, x510 y352 w90 h40 gExit, Exit App return } else { Gui, Submit, Hide Gui, Destroy Sleep, 40 return } ; 获取当前图片文件路径(核心修复) GetImagePath() { WinGetTitle, WinTitle, A ; 处理Windows照片查看器/Photos应用的窗口标题格式 if (InStr(WinTitle, " - Photos") || InStr(WinTitle, " - 照片")) { ; 提取标题中的文件名 SplitPath, WinTitle, Name,,,,- Photos SplitPath, WinTitle, Name,,,,- 照片 ; 尝试从常见图片目录查找(可根据实际存储路径调整) PossiblePaths := ["C:\Photos", A_ScriptDir, A_Desktop] for _, Path in PossiblePaths { FullPath := Path "\" Name if FileExist(FullPath) { return FullPath } } } ; 处理其他图片查看器,直接尝试从窗口标题解析路径 if FileExist(WinTitle) { return WinTitle } ; fallback:获取文件资源管理器中选中的文件 WinGet, ActiveWnd, ID, A if (ActiveWnd = WinExist("ahk_class CabinetWClass")) { Clipboard := "" SendInput, ^c ClipWait, 1 if Clipboard { return Clipboard } } return "" } gettime: { ; 获取当前图片的完整路径 ImagePath := GetImagePath() if (!ImagePath) { MsgBox, 无法获取图片文件路径,请确保图片在支持的查看器中打开 return } ; 获取文件修改时间 FileGetTime, CreationDate, %ImagePath%, M CreationDate += %Timecorrection%, Hours FormatTime, CreationDateFormatted, %CreationDate%, M/dd/yyyy HH:mm:ss ; 提取文件名 SplitPath, ImagePath, Name ; 写入数据文件(修正变量错误:用Dest替代未定义的count) FileAppend, %Name% %CreationDateFormatted% %Dest%`n, %A_ScriptDir%/Data.txt Sleep, 100 return } clip: { Gui, Submit, Hide Gui, Destroy Sleep, 40 return } Repeat: { gosub, clip gosub, gettime Sleep, 20 return } OpenData: { Run, %A_ScriptDir%/Data.txt return } B1: { Dest := %button1% gosub, gettime Gui, Destroy return } B2: { Dest := %button2% gosub, gettime Gui, Destroy return } B3: { Dest := %button3% gosub, gettime Gui, Destroy return } TEST: { Dest := "Test" gosub, gettime Gui, Destroy return } Highlight: { Dest := "Highlights" Gui, Destroy Sleep, 60 return } RESET: { Gui, Submit, Hide Gui, Destroy Reload return } Edit: { Edit return } Exit: { ExitApp return } CANCEL: { Gui, Submit, Hide Gui, Destroy Sleep, 40 return } end:: { gosub, Repeat MsgBox, 4,, %Dest%, 0.5 Send, {right} return }
关键修改说明
- 替换路径获取逻辑:新增
GetImagePath()函数,通过窗口标题解析、常见目录查找、文件资源管理器选中文件三种方式获取图片路径,彻底摆脱对剪贴板复制文件路径的依赖 - 修正变量错误:将原代码中未定义的
%count%替换为实际存储按钮值的%Dest%,确保写入数据正确 - 简化流程:移除冗余的
Ctrl+C复制步骤,直接获取路径后处理,减少错误概率 - 增加容错机制:添加文件路径有效性校验,无法获取路径时弹出提示,避免静默失败
内容的提问来源于stack exchange,提问作者ellen
相关产品推荐
相关产品推荐

