Не скрываются папки после обновления через функцию SHChangeNotify

130
12 мая 2021, 16:40

Сначала я отключаю просмотр всех скрытых файлов и папок через реестр: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

Параметр: Hidden

Значение: 0

Если нажать в контекстном меню windows кнопку "Обновить" то файлы исчезают.

Я же хочу сделать это программным способом.

Пробовал использовать функцию SHChangeNotify

С помощью данных методов пробовал обновить оболочку Windows Explorer в надежде что файлы обновятся и не станут показываться но этого не произошло.

internal static class NativeMethods
{
   [DllImport("Shell32.dll")]
   public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
}
public static void RefreshWindowsExplorer()
{
   NativeMethods.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
}

Пробовал так же использовать данный способ:

public static void Refresh()
{
   NativeMethods.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
   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", BindingFlags.InvokeMethod, null, shellApplication, new object[] { });
 Type windowsType = windows.GetType();
 object count = windowsType.InvokeMember("Count", BindingFlags.GetProperty, null, windows, null);
 for (int i = 0; i < (int)count; i++)
 {
    object item = windowsType.InvokeMember("Item", BindingFlags.InvokeMethod, null, windows, new object[] { i });
    Type itemType = item.GetType();
    string itemName = (string)itemType.InvokeMember("Name", BindingFlags.GetProperty, null, item, null);
    if ((itemName == "Windows Explorer") || (itemName == "File Explorer"))
    {
       itemType.InvokeMember("Refresh", BindingFlags.InvokeMethod, null, item, null);
    }
 }
}

Вопрос: Как обновить Всю цепочку Windows Explorer чтобы файлы исчезали из поля зрения?

Answer 1

Решил проблему благодаря функции SHGetSetSettings

От сюда взял необходимый код и немного его видоизменил под себя убрал всё лишнее.

В классе NativeMethods.cs добавил

[DllImport("shell32.dll")]
public extern static void SHGetSetSettings(ref Structures.SHELLSTATE lpss, Structures.SSF dwMask, bool bSet);

Создал класс Structures.cs

internal static class Structures
{
   [Flags]
   public enum SSF : int
   {
     SSF_SHOWALLOBJECTS = 0x00000001,
     SSF_SHOWSYSFILES = 0x00000020,
     SSF_SHOWSUPERHIDDEN = 0x00040000,
   }
   [StructLayout(LayoutKind.Sequential)]
   public struct SHELLSTATE
   {
      public uint bitvector1, dwWin95Unused, uWin95Unused;
      public int lParamSort, iSortDirection;
      public uint version, uNotUsed, bitvector2;
      public uint FShowAllObjects
      {
         get => this.bitvector1 & 1;
         set => this.bitvector1 = value | this.bitvector1;
      }
      public uint FShowSuperHidden
      {
         get => (this.bitvector1 & 0x8000) / 0x8000;
         set => this.bitvector1 = (value * 0x8000) | this.bitvector1;
      }
    }
}

И создал метод который скрывает все скрытые файлы и папки из поля зрения пользователя

public static void HideHiddenFiles(bool bShow)
{
   Structures.SHELLSTATE state = new Structures.SHELLSTATE
   {
     FShowSuperHidden = (uint)(bShow ? 1 : 0)
   };
   NativeMethods.SHGetSetSettings(ref state, Structures.SSF.SSF_SHOWALLOBJECTS | Structures.SSF.SSF_SHOWSUPERHIDDEN, true);
}

Используется так:

HideHiddenFiles(false) // Скрыть все скрытые файлы и папки
HideHiddenFiles(true) // Показать все скрытые  файлы и папки ( к сожалению на win 10 это не сработало, всё обновляется но файлы не показываются :(  )

P.S: Если кто-то найдёт решение показа скрытых файлов и папок раньше меня)) напишите пожалуйста.

READ ALSO
Как бегущую строку сделать более плавной и гладкой?

Как бегущую строку сделать более плавной и гладкой?

Имеется код который запускает label и он движется ровно от середины до края

249
C#, Не удается запустить службу Windows

C#, Не удается запустить службу Windows

Написал службу Windows на C#При запуске выдается ошибка: Не удалось запустить службу TFFU на Локальный компьютер

113
Unity не работает клик на UI элемент

Unity не работает клик на UI элемент

В игре есть инвентарь, и при клике на какой-либо слот беру предмет, но перед этим хочу вообще проверить, работает ли клик, и данный код не срабатывает,...

130