如何在 C# 中应用 Windows 任务栏更改而不重新启动资源管理器?

Posted

技术标签:

【中文标题】如何在 C# 中应用 Windows 任务栏更改而不重新启动资源管理器?【英文标题】:How to apply Windows taskbar changes without restarting Explorer in C#? 【发布时间】:2020-05-21 10:15:59 【问题描述】:

这是我当前的代码,它可以工作,但它会重新启动资源管理器进程,这有点奇怪。

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Win32;

namespace MyApp

    class Program
    
        static async Task Main(string[] args)
        
            ShowSmallTaskbarIcons();
            // ShowLargeTaskbarIcons();
            Console.WriteLine("Press a key to exit...");
            Console.ReadKey();
        

        static void ShowSmallTaskbarIcons()
        
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarSmallIcons", "1", RegistryValueKind.DWord);
            RefreshExplorer();
        

        static void ShowLargeTaskbarIcons()
        
            var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", writable: true);
            key.DeleteValue("TaskbarSmallIcons", throwOnMissingValue: false);
            key.Close();
            RefreshExplorer();
        

        static void RefreshExplorer()
        
            Process.Start("taskkill.exe", "/f /im explorer.exe");
            Thread.Sleep(2000);
            Process.Start("explorer.exe");
            Thread.Sleep(10000);
        
    

我想对“设置”中的“使用小任务栏按钮”切换开关做同样的事情。

如何用 C# 做同样的事情?

【问题讨论】:

请问为什么不需要重启windows explorer? 东西突然从屏幕上消失有点令人不安。 it restarts the Explorer process and that's kinda weird 你从来没有在你的帖子中描述过kinda weird 是什么。您确实知道您正在自己杀死任务然后重新启动它,请以其他方式说明您的代码正在做什么。 我想模仿 Windows 的做法,似乎有办法重新启动或应用任务栏更改。 找到渲染任务栏的函数并只使用它们。根据需要更改变量。 【参考方案1】:

How to change Windows 10 taskbar icon size programmatically

这篇文章有一个关于如何在 c++ 中发送 WM_SETTINGCHANGE 消息的示例。

但是,在 c# 包装函数中没有简单的方法可以做到这一点。你必须通过 p/invoke 来完成

以下帖子将帮助您在 c# 中做到这一点

convert C++ code to C#: SendMessageTimeout()

【讨论】:

你有我可以与 SendMessageTimeout 一起使用的所有 lParam 字符串的列表吗? 我应该使用 SendNotifyMessage() 还是 SendMessageTimeout()? 检查 msdn 以获取 lParam 表。 docs.microsoft.com/en-us/windows/win32/winmsg/… msdn 还指出 SendMessageTimeout 是正确的功能。 关于“lParam”值,是否有一个包含所有可用元素的列表,如“TraySettings”?

以上是关于如何在 C# 中应用 Windows 任务栏更改而不重新启动资源管理器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 从 Windows 任务栏中删除新闻和兴趣? [关闭]

有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

如何在 Windows 7 上删除 Java 程序的标题栏和任务栏图标?

如何在 TaskManager 中更改 C# WinForms exe 的图标

如何设置 QMainWindow 的 Windows 任务栏标题?

C#任务栏中的Windows 7进度条?