Форум2022-08-18T02:06:35+03:00
Вы должны войти, чтобы создавать сообщения и темы.

Динамически скрыть папки через реестр

Здравствуйте, программно изменяю параметр Hidden в ветке реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced по нажатию кнопки WinForms, далее нужно обновить рабочий стол и все папки в проводнике вручную. Вопрос: можно ли это сделать программно, применяя WinApi?
Пробовал так: SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero) , через SendMessage  и через множество других функций. Заранее прошу прощения, если такой вопрос уже поднимался, не нашёл на форуме. Спасибо

Привет 👋. Предлагаю вариант без реестра.

Вот код

internal class Program
 {
     static void Main(string[] args)
     {            
         SHELLSTATE state = new SHELLSTATE
         {
             fShowAllObjects = true
         };
         Win32Helper.SHGetSetSettings(ref state, ShellStateConstants.SSF_SHOWALLOBJECTS, true);
     }
 }
 internal static class Win32Helper
 {        
     [DllImport("shell32.dll")]
     internal static extern void SHGetSetSettings(ref SHELLSTATE lpss, uint dwMask,[MarshalAs(UnmanagedType.Bool)] bool bSet);
     [StructLayout(LayoutKind.Sequential)]
     public struct SHELLSTATE
     {
         public bool fShowAllObjects;
         public bool fShowExtensions;
         public bool fNoConfirmRecycle;
         public bool fShowSysFiles;
         public bool fShowCompColor;
         public bool fDoubleClickInWebView;
         public bool fDesktopHTML;
         public bool fWin95Classic;
         public bool fDontPrettyPath;
         public bool fShowAttribCol;
         public bool fMapNetDrvBtn;
         public bool fShowInfoTip;
         public bool fHideIcons;
         public bool fWebView;
         public bool fFilter;
         public bool fShowSuperHidden;
         public bool fNoNetCrawling;
         public uint dwWin95Unused;
         public uint uWin95Unused;
         public int lParamSort;
         public int iSortDirection;
         public uint version;
         public uint uNotUsed;
         public bool fSepProcess;
         public bool fStartPanelOn;
         public bool fShowStartPage;
         public bool fAutoCheckSelect;
         public bool fIconsOnly;
         public bool fShowTypeOverlay;
         public bool fShowStatusBar;
         public uint fSpareFlags;
     }       
     internal struct ShellStateConstants
     {
         public const int SSF_SHOWALLOBJECTS = 0x00000001;
         public const int SSF_SHOWEXTENSIONS = 0x00000002;
         public const int SSF_HIDDENFILEEXTS = 0x00000004;
         public const int SSF_SERVERADMINUI = 0x00000004;
         public const int SSF_SHOWCOMPCOLOR = 0x00000008;
         public const int SSF_SORTCOLUMNS = 0x00000010;
         public const int SSF_SHOWSYSFILES = 0x00000020;
         public const int SSF_DOUBLECLICKINWEBVIEW = 0x00000080;
         public const int SSF_SHOWATTRIBCOL = 0x00000100;
         public const int SSF_DESKTOPHTML = 0x00000200;
         public const int SSF_WIN95CLASSIC = 0x00000400;
         public const int SSF_DONTPRETTYPATH = 0x00000800;
         public const int SSF_MAPNETDRVBUTTON = 0x00001000;
         public const int SSF_SHOWINFOTIP = 0x00002000;
         public const int SSF_HIDEICONS = 0x00004000;
         public const int SSF_NOCONFIRMRECYCLE = 0x00008000;
         public const int SSF_FILTER = 0x00010000;
         public const int SSF_WEBVIEW = 0x00020000;
         public const int SSF_SHOWSUPERHIDDEN = 0x00040000;
         public const int SSF_SEPPROCESS = 0x00080000;
         public const int SSF_NONETCRAWLING = 0x00100000;
         public const int SSF_STARTPANELON = 0x00200000;
         public const int SSF_SHOWSTARTPAGE = 0x00400000;
         public const int SSF_AUTOCHECKSELECT = 0x00800000;
         public const int SSF_ICONSONLY = 0x01000000;
         public const int SSF_SHOWTYPEOVERLAY = 0x02000000;
         public const int SSF_SHOWSTATUSBAR = 0x04000000;
     }
 }

P.S Правильность структур не гарантирую.

Цитата: Иван от 08.06.2023, 16:12

Пробовал так: SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero) , через SendMessage  и через множество других функций.

Доброго дня. Вы так пробовали?

[DllImport("shell32.dll")]
public static extern void SHChangeNotify(int eventID, int flags, IntPtr item1, IntPtr item2);

// Update Explorer
SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);

Можно же и через PostMsg сделать

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

const int WM_SETTINGCHANGE = 0x001a; //Опкод может быть 0x001A
const int HWND_BROADCAST = 0xffff;

//Точно так же обновляем как и и SendMessgae
PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, IntPtr.Zero);

ссылка на Pinvoke для User32.dll

https://www.pinvoke.net/default.aspx/user32/PostMessage.html

p.s.Если модератор сомневается. Pinvoke это WIKI в страну WinAPI для c#

Go to Top