我有一个函数可以更改注册表值以在 Windows 任务栏中隐藏不需要的图标(tryOpenCreateKey 是一个更新现有值或在密钥不存在时创建密钥的函数,因为组策略可以做奇怪的事情)。
public static void changeTaskBar()
{
string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
string setting = "EnableAutoTray";
int setTo = 1;
using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(subKey, true))
{
tryOpenCreateKey(regKey, setting, setTo, RegistryValueKind.DWord, subKey);
SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); //Updates Windows Explorer with new reg changes
}
}
如果在加载 Windows 时将注册表值设置为 0,则所有任务栏托盘图标都可见。正确运行此代码会将其设置为 1,但要使其在视觉上生效,需要重新启动 explorer.exe。
在“通知区域图标”菜单中,有一个“始终在任务栏上显示图标和通知”选项,它会更新此注册表值并刷新 explorer.exe 的显示,而无需重新启动它。
我也希望能够以编程方式执行此操作。我有一个类似的功能,可以取消隐藏隐藏的文件和文件夹,它必须调用资源管理器的刷新才能使隐藏的项目真正可见。
[Flags]
private enum HChangeNotifyEventID
{
SHCNE_ASSOCCHANGED = 0x08000000,
}
[Flags]
private enum HChangeNotifyFlags
{
SHCNF_IDLIST = 0x0000
}
[Flags]
private enum SendMessageTimeoutFlags : uint
{
SMTO_ABORTIFHUNG = 0x2,
}
[DllImport("shell32.dll")]
private static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2);
是否有类似的 shell32 函数(或其他 Windows API)来刷新任务栏并更新隐藏的托盘图标。