在Win7中刷新Windows资源管理器

Pay*_*aya 16 .net c# windows windows-explorer windows-7

我的计划设定"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"价值"Hidden".Hovewer我无法刷新资源管理器以考虑此更改.我试过了:

1)

    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);` 
Run Code Online (Sandbox Code Playgroud)

2)

    SHELLSTATE state = new SHELLSTATE(); 
    state.fShowAllObjects = (uint)1; 
    SHGetSetSettings(ref state, SSF.SSF_SHOWALLOBJECTS, true); 
Run Code Online (Sandbox Code Playgroud)

3)

    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 5000, ref dwResult); 
Run Code Online (Sandbox Code Playgroud)

4)

    SendMessage(HWND_BROADCAST, WM_COMMAND, 28931 /* Refresh */, 0); 
Run Code Online (Sandbox Code Playgroud)

什么都行不通.所以我该怎么做?如果我用F5自己刷新资源管理器,那么它可行.Hovewer我想要一些优雅的解决方案,所以它会在任何地方刷新显示,甚至在OpenFile/ SaveFile对话框中,这些都是当前打开的.

我正在使用C#.NET,Win7.

状态更新#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();
Run Code Online (Sandbox Code Playgroud)

所以这一部分已经完成.Hovewer我仍然需要刷新OpenFile/ SaveFile对话框,上面的代码不会这样做.有人知道如何刷新这些对话框吗?

重要的一点是,如果我在"控制面板"中的"文件夹选项"中更改"显示隐藏文件",系统不会刷新这些OpenFile/ SaveFile对话框,我必须使用F5手动刷新它们.我只是在寻找一种方法如何使用C#刷新所有这些对话框,所以我不再需要再按F5了...

状态更新#2

好吧,所以上面的代码出现了新的问题 - 它不仅刷新了Windows资源管理器,还刷新了互联网资源管理器...任何想法如何刷新Windows资源管理器?

Ada*_*dam 16

我找到了一种方法来检查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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 起初,代码在Windows 8上对我不起作用.我添加了对itemName =="文件资源管理器"的额外检查.`if(itemName =="Windows资源管理器"|| itemName =="文件资源管理器")`之后就可以了.这篇文章(http://winsupersite.com/article/windows8/windows-8-feature-focus-file-explorer-144727)表示它已重命名为Windows 8中的文件资源管理器.谢谢. (2认同)