刷新Windows资源管理器,在windows7资
-
21-09-2019 - |
题
我的程序设置 "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
值 "Hidden"
.Hovewer我不能刷新的资源管理器,以考虑到这一变化。我已经试过:
1)
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);`
2)
SHELLSTATE state = new SHELLSTATE();
state.fShowAllObjects = (uint)1;
SHGetSetSettings(ref state, SSF.SSF_SHOWALLOBJECTS, true);
3)
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 5000, ref dwResult);
4)
SendMessage(HWND_BROADCAST, WM_COMMAND, 28931 /* Refresh */, 0);
没有什么工作。所以我应该怎么做?如果我刷新Explorer自己F5,那么它的工作。Hovewer我想一些优雅的解决方案,所以它将会刷新将显示无处不在,甚至在 OpenFile
/SaveFile
的对话,这是目前开放。
我使用。净,windows7资.
状态更新#1
作为 Anders
指出的那样,有一个简单的方法刷新资源管理器窗口使用COM:
Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
dynamic shellApplication = Activator.CreateInstance(shellApplicationType);
dynamic windows = shellApplication.Windows();
for (int i = 0; i < windows.Count; i++)
windows.Item(i).Refresh();
因此,这一部分已经完成。 Hovewer我仍然需要刷新 OpenFile
/SaveFile
对话、和上述代码没有做到这一点。没有任何人知道如何刷新这些对话?
很重要的一点是,如果我改变"显示隐藏的文件"的文件夹中选项的控制面板,这些 OpenFile
/SaveFile
对话是不刷新的系统,我必须刷新他们手动使用F5。我只是在寻找一个方法如何刷新所有那些对话使用C#所以我不需要按F5了...
状态更新#2
Ok,因此新的问题与上述代码-这刷新,不仅windows探险家,而且互联网的探险家...任何想法刷新windows探险者吗?
解决方案
我想出了一个办法来检查,如果窗户是一个Windows资源管理器窗口,并没有足够的一个代表来添加评论这样认为我会提交一个答案来帮助你,因为这个问题的帮助我。
// based on http://stackoverflow.com/questions/2488727/refresh-windows-explorer-in-win7
Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
object shellApplication = Activator.CreateInstance(shellApplicationType);
object windows = shellApplicationType.InvokeMember("Windows", System.Reflection.BindingFlags.InvokeMethod, null, shellApplication, new object[] { });
Type windowsType = windows.GetType();
object count = windowsType.InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, windows, null);
for (int i = 0; i < (int)count; i++)
{
object item = windowsType.InvokeMember("Item", System.Reflection.BindingFlags.InvokeMethod, null, windows, new object[] { i });
Type itemType = item.GetType();
// only refresh windows explorers
string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
if (itemName == "Windows Explorer")
{
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
}
其他提示
我不知道关于开放/省之间的对话,但你可以得到一个列表中的资源管理器打开窗户COM自动化, 外壳。应用程序 目的有一个 收集的窗户, 或共创IID_IShellWindows直接,每个窗口,在列表中有一个刷新的方法。
WSH/JScript:
for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
sw.Item(i).Refresh();
我不知道,但这是例子处理程序窗口在 WSH/JScript 和 c++
当您安装注册文件类型的应用程序,资源管理器窗口会经常更新,以显示新的关联? - 你可以窥视API调用安装程序正在看它如何刷新窗口
使用的Windows 10,其具有改变了资源管理器窗口的名称:
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}