C# 刷新资源管理器

问题描述 投票:0回答:2

在我的程序中,我切换隐藏文件的注册表值以告诉资源管理器是否隐藏或显示它们。但是,由于资源管理器不会自行刷新,因此我发送了事件

 SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);

刷新一切。然而,不幸的是,它似乎并没有带来任何令人耳目一新的东西。我看到桌面上的屏幕有点闪烁,但为了看到更改,我必须手动刷新文件夹。 SHChangeNotify 似乎不适合我。任何帮助将不胜感激。

c# winapi refresh explorer
2个回答
0
投票

尝试使用 SHGetSetSettings 更改 fShowAllObjects

使用 SHGetSetSettings 进行简单的获取和设置将不起作用。

它足够智能,可以将当前设置与您发送的设置进行比较,并且只有在两者不同时才会通知其他窗口更改。

要刷新桌面,请使用 IShellWindows 枚举 shell 窗口,请检查 IWebBrowser2.FullName 属性以跳过 IE 窗口,然后调用 IWebBrowser2::Refresh。


-1
投票

15 年后的今天,我在 Windows 10 和 11 上面临着同样的挑战。

我着手制作一个上下文菜单项,可以切换隐藏文件和系统文件的显示,而无需重新启动资源管理器。如果您正在摆弄desktop.ini 文件并且不希望它们始终显示,那么这会很方便。是的,可以通过资源管理器界面切换此类文件的显示,但点击起来很繁琐。

某些资源管理器设置(例如拖动灵敏度)可以通过 SystemParametersInfo API 进行更改,但许多设置(例如我们感兴趣的设置)则无法更改。

此外,有很多帖子表明答案是广播 WM_SETTINGCHANGE 但这对我们感兴趣的设置也没有影响。

据我所知,让资源管理器更新其有效设置(用于显示隐藏文件和系统文件(以及许多其他选项))的唯一方法是让资源管理器从注册表刷新其设置。显然,这只能通过按 F5 或重新启动资源管理器来实现。虽然在任何程序中使用 SendKeys 都不是理想的选择,但在这种情况下,它是比重新启动资源管理器更好的选择。

对于我的项目,我更新注册表值,等待十分之一秒,然后使用 SendKeys“按”F5。这使得资源管理器从注册表中读取新值并更新当前文件夹的视图。然后,代码使用 SHChangeNotify 进行 shell 刷新,从而更新其他位置的视图。

十分之一秒的等待并不完全是任意的。如果根本没有等待,F5 键将发送得太快,导致视图没有变化。由于我们并不着急,因此十分之一秒的延迟是确保注册表更新完成的合理延迟。我不认为有任何理由让它变得过于复杂。如果我要采用使用 SendKeys 的解决方案,我几乎肯定必须在某处采用一些节奏。

这是代码:

static void ShowHide()
{
    string AdvKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced";
    bool Hidden = (int)Registry.GetValue(AdvKey, "Hidden", 0) == 1;
    int h1 = 1; int h2 = 1;
    if (Hidden) { h1 = 2; h2 = 0; }
    Registry.SetValue(AdvKey, "Hidden", h1, RegistryValueKind.DWord);
    Registry.SetValue(AdvKey, "ShowSuperHidden", h2, RegistryValueKind.DWord);
    Thread.Sleep(100);
    SendKeys.SendWait("{F5}");
    SHChangeNotify(0x08000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
}

[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
© www.soinside.com 2019 - 2024. All rights reserved.