我的程序设置"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
值"Hidden"
。 Hovewer我无法刷新资源pipe理器来考虑这个变化。 我试过了:
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);
没有任何工作 所以我该怎么做? 如果我用F5自己刷新资源pipe理器,那么它工作。 Hovewer我想要一个优雅的解决scheme,所以它会刷新显示在任何地方,即使在OpenFile
/ SaveFile
对话框,这是当前打开。
我正在使用C#.NET,Win7。
正如Anders
指出的那样,使用COM刷新资源pipe理器窗口有一个简单的方法:
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了。
好吧,上面的代码是如此新的问题 – 它不仅刷新窗口的探索者,而且还刷新互联网…任何想法如何刷新窗口探索者?
我想出了一个办法来检查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自动获取打开的资源管理器窗口列表, Shell.Application对象具有窗口集合 ,或者直接使用CoCreate IID_IShellWindows,列表中的每个窗口都有一个刷新方法。
WSH / JScript的:
for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i) sw.Item(i).Refresh();
我不知道关于C#,但这里是处理WSH / JScript和c + +的 shell窗口的例子
在安装注册文件类型的应用程序时,通常会刷新资源管理器窗口以指示新的关联 – 您是否可以监视安装程序正在进行的API调用以查看其刷新窗口的方式?