我有一个 WPF C# 项目,我正在其中实现 Windows 文件夹选项的设置。其中之一是“单击打开项目”(而不是双击)。当我为此更改注册表项时,我需要刷新我找到解决方案的 Windows 资源管理器。但是桌面不会刷新,即使手动刷新也不会应用更改。我使用IActiveDesktop::ApplyChanges
了方法但没有奏效(或者我犯了一个错误)。我也使用了这个代码片段,但它仍然没有应用我所做的更改:
SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
这是我用于刷新 Windows Explorer 的完整代码片段(来自此站点):
[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
public static void RefreshWindowsExplorer()
{
// Refresh the desktop
SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
// Refresh any open explorer 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 Explorer, without checking for the name this could refresh open IE windows
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);
}
}
}
这适用于 Windows 资源管理器,但不适用于桌面(这很奇怪,因为桌面也依赖于资源管理器)。那么我应该如何重新加载桌面以使我的更改生效?