如何编程触发资源管理器刷新MTP设备文件夹内容?
刷新MTP文件夹或所有资源管理器窗口的实现方案
一、刷新指定MTP文件夹
MTP设备属于Shell命名空间,无法通过盘符路径定位,需借助PIDL(Item ID List)实现精准刷新:
- 先获取MTP文件夹的Shell命名空间路径,格式示例:
::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}\[你的设备名称]\[目标文件夹路径] - 调用
SHParseDisplayName将该路径转换为PIDL - 使用
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路径,可直接枚举所有资源管理器窗口并触发刷新:
- 通过
EnumWindows枚举所有顶层窗口 - 判断窗口类是否为资源管理器专属的
CabinetWClass(普通窗口)或ExploreWClass(带导航栏窗口) - 向符合条件的窗口发送
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
相关产品推荐
相关产品推荐

