gpt4 book ai didi

c# - 在 Win7 中刷新 Windows 资源管理器

转载 作者:可可西里 更新时间:2023-11-01 12:23:26 24 4
gpt4 key购买 nike

我的程序设置 "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); 

没有任何作用。所以我该怎么做?如果我自己用 F5 刷新 Explorer,那么它就可以工作。 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();

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

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

状态更新#2

好的,上面代码的新问题 - 它不仅刷新 Windows 资源管理器,还刷新 Internet 资源管理器...知道如何仅刷新 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);
}
}

关于c# - 在 Win7 中刷新 Windows 资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com