You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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结尾,这是SHFileOperation API的强制格式要求
  • 代码已兼容32位和64位版本的AutoHotkey
  • 若路径中包含空格,无需额外加引号,API会自动处理

内容的提问来源于stack exchange,提问作者Mg Bhadurudeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:33:25