在 Win7 中刷新 Windows 资源管理器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2488727/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 14:10:06  来源:igfitidea点击:

Refresh Windows Explorer in Win7

c#.netwindowswindows-7windows-explorer

提问by Paya

My program sets "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"value "Hidden". Hovewer I'm not able to refresh the explorer to take into account this change. I've tried:

我的程序设置"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"value "Hidden"。但是,我无法刷新资源管理器以考虑此更改。我试过了:

1)

1)

    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);` 

2)

2)

    SHELLSTATE state = new SHELLSTATE(); 
    state.fShowAllObjects = (uint)1; 
    SHGetSetSettings(ref state, SSF.SSF_SHOWALLOBJECTS, true); 

3)

3)

    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 5000, ref dwResult); 

4)

4)

    SendMessage(HWND_BROADCAST, WM_COMMAND, 28931 /* Refresh */, 0); 

Nothing works. So what should I do? If I refresh Explorer myself with F5, then it works. Hovewer I would like some elegant solution, so it would refresh the display everywhere, even in OpenFile/SaveFiledialogs, which are currently open.

没有任何作用。所以我该怎么做?如果我自己用 F5 刷新资源管理器,那么它就可以工作。然而,我想要一些优雅的解决方案,因此它会在任何地方刷新显示,即使在当前打开的OpenFile/SaveFile对话框中也是如此。

I'm using C# .NET, Win7.

我正在使用 C# .NET、Win7。

Status Update #1

状态更新 #1

As Anderspointed out, there is a simple way to refresh explorer windows using COM:

正如所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();

So this part is done.Hovewer I still need to refresh the OpenFile/SaveFiledialogs, and the code above doesn't do that. Does anybody know how to refresh those dialogs?

这样这部分就完成了。但是我仍然需要刷新OpenFile/SaveFile对话框,而上面的代码并没有这样做。有人知道如何刷新这些对话框吗?

An important point is that if I change the "Show Hidden Files" in Folder Options in Control panel, those OpenFile/SaveFiledialogs are not refreshed by the system, I must refresh them manually using F5. I'm just looking for a method how to refresh all those dialogs using C#, so I don't need to press F5 anymore...

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

Status Update #2

状态更新 #2

Ok, so new problem with the code above - it refresh not only windows explorers, but also internet explorers... Any idea how to refresh windows explorers ONLY?

好的,上面代码的新问题 - 它不仅刷新 Windows 资源管理器,还刷新 Internet Explorer ......知道如何仅刷新 Windows 资源管理器吗?

回答by Adam

I figured out a way to check if the windows was a Windows Explorer window, and don't have enough of a rep to add a comment so thought I'd submit it as an answer to help you out because this question helped me out.

我想出了一种方法来检查 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);
            }
        }

回答by Anders

I don't know about Open/Save dialogs, but you can get a list of open explorer windows with COM automation, the Shell.Applicationobject has a collection of windows, or CoCreate IID_IShellWindows directly, each window in the list has a refresh method.

我不知道打开/保存对话框,但是你可以通过 COM 自动化获得一个打开的资源管理器窗口列表,Shell.Application对象有一个windows 集合,或者直接 CoCreate IID_IShellWindows,列表中的每个窗口都有一个刷新方法.

WSH/JScript:

WSH/JScript:

for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
   sw.Item(i).Refresh();

I don't know about C#, but here are examples dealing with shell windows in WSH/JScriptand c++

我不了解 C#,但这里有一些在WSH/JScriptC++ 中处理 shell 窗口的示例

回答by ultrafez

When you install an application that registers a file type, Explorer windows often refresh to indicate the new association - could you spy on the API calls that an installer is making to see how it refreshes the window?

当您安装注册文件类型的应用程序时,资源管理器窗口经常刷新以指示新的关联 - 您能否监视安装程序进行的 API 调用以查看它如何刷新窗口?

回答by Edgar5

With Windows 10 having changed the name of the Explorer window:

Windows 10 更改了资源管理器窗口的名称:

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}