如何用AHK调用Windows文件夹复制对话框?
用AutoHotkey调用Windows原生文件夹复制对话框
实现方案
直接调用Windows Shell API中的SHFileOperation函数,该函数会触发系统原生的文件夹复制对话框,支持进度显示、冲突处理(如覆盖提示)、撤销操作等系统自带交互逻辑,完全替代AHK内置的FileCopyDir函数。
完整可运行代码
; 定义SHFileOperation所需的结构体 SHFILEOPSTRUCT(structSize, hwnd, wFunc, pFrom, pTo, fFlags, fAnyOperationsAborted, hNameMappings, lpszProgressTitle) { this.Size := structSize this.hwnd := hwnd this.wFunc := wFunc this.pFrom := pFrom this.pTo := pTo this.fFlags := fFlags this.fAnyOperationsAborted := fAnyOperationsAborted this.hNameMappings := hNameMappings this.lpszProgressTitle := lpszProgressTitle } ; 核心复制函数:接收源路径和目标路径,调用原生对话框执行复制 CopyFolderWithNativeDialog(sourceDir, targetDir) { ; 统一路径分隔符为反斜杠,并添加API要求的空字符结尾 sourceDir := StrReplace(sourceDir, "/", "\") sourceDir .= (SubStr(sourceDir, -1) = "\") ? "\0" : "\0" targetDir := StrReplace(targetDir, "/", "\") targetDir .= (SubStr(targetDir, -1) = "\") ? "\0" : "\0" ; 根据AHK位数初始化结构体内存 structSize := (A_PtrSize = 8) ? 88 : 60 VarSetCapacity(SHFO, structSize, 0) ; 设置操作参数:复制、自动创建目标文件夹、支持撤销 fo := new SHFILEOPSTRUCT(structSize, 0, 0x0002, &sourceDir, &targetDir, 0x0008 | 0x0040, 0, 0, "") ; 将结构体数据写入内存(兼容32/64位) if (A_PtrSize = 4) { NumPut(fo.Size, SHFO, 0, "UInt") NumPut(fo.hwnd, SHFO, 4, "Ptr") NumPut(fo.wFunc, SHFO, 8, "UInt") NumPut(&sourceDir, SHFO, 12, "Ptr") NumPut(&targetDir, SHFO, 16, "Ptr") NumPut(fo.fFlags, SHFO, 20, "UInt") NumPut(fo.fAnyOperationsAborted, SHFO, 24, "UInt") NumPut(fo.hNameMappings, SHFO, 28, "Ptr") NumPut(&fo.lpszProgressTitle, SHFO, 32, "Ptr") } else { NumPut(fo.Size, SHFO, 0, "UInt") NumPut(fo.hwnd, SHFO, 8, "Ptr") NumPut(fo.wFunc, SHFO, 16, "UInt") NumPut(&sourceDir, SHFO, 24, "Ptr") NumPut(&targetDir, SHFO, 32, "Ptr") NumPut(fo.fFlags, SHFO, 40, "UInt") NumPut(fo.fAnyOperationsAborted, SHFO, 44, "UInt") NumPut(fo.hNameMappings, SHFO, 48, "Ptr") NumPut(&fo.lpszProgressTitle, SHFO, 56, "Ptr") } ; 调用API执行复制 DllCall("Shell32.dll\SHFileOperation", "Ptr", &SHFO) ; 检查是否被用户中止 aborted := NumGet(SHFO, (A_PtrSize=8 ? 44 : 24), "UInt") if (aborted) MsgBox, 用户中止了复制操作 } ; ------------------- 示例调用 ------------------- sourcePath := "C:\你的源文件夹路径" targetPath := "D:\你的目标文件夹路径" CopyFolderWithNativeDialog(sourcePath, targetPath)
关键参数说明
0x0002(FO_COPY):指定操作类型为文件夹复制0x0008(FOF_NOCONFIRMMKDIR):自动创建不存在的目标文件夹,无需用户确认0x0040(FOF_ALLOWUNDO):允许通过回收站撤销本次复制操作- 若需要保留系统默认的覆盖确认提示,不要添加
FOF_NOCONFIRMATION(0x0010)参数
注意事项
- 路径必须以
\0结尾,这是SHFileOperationAPI的强制格式要求 - 代码已兼容32位和64位版本的AutoHotkey
- 若路径中包含空格,无需额外加引号,API会自动处理
内容的提问来源于stack exchange,提问作者Mg Bhadurudeen
相关产品推荐
相关产品推荐

