Мои наборы программы "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, то он работает. Hovewer я хотел бы некоторое изящное решение, таким образом, это обновит дисплей везде, даже в OpenFile
/SaveFile
диалоговые окна, которые в настоящее время открыты.
Я использую.NET C#, Win7.
Как 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();
Таким образом, эта часть сделана. Hovewer я все еще должен обновиться OpenFile
/SaveFile
диалоговые окна и код выше не делают этого. Кто-либо знает, как обновить те диалоговые окна?
Важный момент - это, если я изменяю "Выставочные Скрытые файлы" в Опциях Папки в Панели управления, них OpenFile
/SaveFile
диалоговые окна не обновляются системой, я должен обновить их вручную использующий F5. Я просто ищу метод, как обновить все те диалоговые окна с помощью C#, таким образом, я не должен больше нажимать F5...
Хорошо, так новая проблема с кодом выше - это обновляет не только проводники окон, но также и интернет-проводники... Какая-либо идея, как обновить проводники окон ТОЛЬКО?
Я нашел способ проверить, являются ли окна окном проводника 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);
}
}
Я не знаю о диалогах открытия / сохранения, но вы можете получить список открытых окон проводника с помощью автоматизации COM, объект Shell.Application имеет коллекция окон или CoCreate IID_IShellWindows напрямую, каждое окно в списке имеет метод обновления.
WSH / JScript:
for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
sw.Item(i).Refresh();
Я не знаю о C #, но вот примеры работы с окнами оболочки в WSH / JScript и c ++
Когда вы устанавливаете приложение, которое регистрирует тип файла, окна проводника часто обновляются, чтобы указать на новую ассоциацию - не могли бы вы шпионить за API вызовы, которые делает установщик, чтобы увидеть, как он обновляет окно?