Динамически скрыть папки через реестр
Цитата: Иван от 08.06.2023, 16:12Здравствуйте, программно изменяю параметр Hidden в ветке реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced по нажатию кнопки WinForms, далее нужно обновить рабочий стол и все папки в проводнике вручную. Вопрос: можно ли это сделать программно, применяя WinApi?
Пробовал так: SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero) , через SendMessage и через множество других функций. Заранее прошу прощения, если такой вопрос уже поднимался, не нашёл на форуме. Спасибо
Здравствуйте, программно изменяю параметр Hidden в ветке реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced по нажатию кнопки WinForms, далее нужно обновить рабочий стол и все папки в проводнике вручную. Вопрос: можно ли это сделать программно, применяя WinApi?
Пробовал так: SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero) , через SendMessage и через множество других функций. Заранее прошу прощения, если такой вопрос уже поднимался, не нашёл на форуме. Спасибо
Цитата: Viсtor от 10.06.2023, 15:23Привет 👋. Предлагаю вариант без реестра.
[spoiler title="Вот код"]
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; } }[/spoiler]
P.S Правильность структур не гарантирую.
Привет 👋. Предлагаю вариант без реестра.
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 Правильность структур не гарантирую.
Цитата: Roman Anderson [anomal3] от 14.06.2023, 10:31Цитата: Иван от 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#
Цитата: Иван от 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#