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

如何编程触发资源管理器刷新MTP设备文件夹内容?

刷新MTP文件夹或所有资源管理器窗口的实现方案

一、刷新指定MTP文件夹

MTP设备属于Shell命名空间,无法通过盘符路径定位,需借助PIDL(Item ID List)实现精准刷新:

  1. 先获取MTP文件夹的Shell命名空间路径,格式示例:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}\[你的设备名称]\[目标文件夹路径]
  2. 调用SHParseDisplayName将该路径转换为PIDL
  3. 使用SHChangeNotify,传入SHCNF_IDLIST参数和PIDL执行刷新

C++代码示例:

#include <ShlObj.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "Shell32.lib")

void RefreshMTPFolder(const wchar_t* mtpFolderPath) {
    LPITEMIDLIST pidl = nullptr;
    HRESULT hr = SHParseDisplayName(mtpFolderPath, nullptr, &pidl, 0, nullptr);
    if (SUCCEEDED(hr)) {
        SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, nullptr);
        CoTaskMemFree(pidl);
    }
}

二、刷新所有打开的资源管理器窗口

若无法精准获取MTP文件夹的Shell路径,可直接枚举所有资源管理器窗口并触发刷新:

  1. 通过EnumWindows枚举所有顶层窗口
  2. 判断窗口类是否为资源管理器专属的CabinetWClass(普通窗口)或ExploreWClass(带导航栏窗口)
  3. 向符合条件的窗口发送WM_COMMAND消息,命令ID指定为ID_REFRESH(0x011C)

C++代码示例:

#include <Windows.h>
#include <Shellapi.h>
#pragma comment(lib, "User32.lib")

#define ID_REFRESH 0x011C

BOOL CALLBACK EnumExplorerWindows(HWND hwnd, LPARAM) {
    wchar_t className[256];
    GetClassNameW(hwnd, className, _countof(className));
    
    if (_wcsicmp(className, L"CabinetWClass") == 0 || _wcsicmp(className, L"ExploreWClass") == 0) {
        SendMessageW(hwnd, WM_COMMAND, ID_REFRESH, 0);
    }
    return TRUE;
}

void RefreshAllExplorerWindows() {
    EnumWindows(EnumExplorerWindows, 0);
}

注意:发送ID_REFRESH命令比模拟F5按键更稳定,可避免窗口焦点问题导致的刷新失效。

内容的提问来源于stack exchange,提问作者elad-ep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:43:19