如何使用.NET在Windows 10/11通知区域显示自定义指定文本
.NET实现Windows 10/11任务栏自定义文本标识方案
实现路径总览
你要实现的类似输入法「ENG」的文本标识有两种可落地的实现方式,可根据需求选择:
方案1:动态生成文本图标嵌入系统托盘(实现成本最低)
不需要做系统级扩展,仅用.NET基础API即可实现,显示效果和需求基本一致。
实现逻辑
将自定义文本渲染为16x16的透明背景图标,插入到系统通知区域(托盘)显示,可随时更新文本内容。
核心实现代码(C#)
如果是.NET 5+环境,需要先安装NuGet包System.Drawing.Common,仅支持Windows平台运行:
using System.Drawing; using System.Windows.Forms; namespace TrayTextDemo { public class TrayTextHelper { private readonly NotifyIcon _notifyIcon; public TrayTextHelper() { _notifyIcon = new NotifyIcon { Visible = true }; } /// <summary> /// 更新托盘显示的文本 /// </summary> /// <param name="displayText">最多支持3位英文字符/2位中文字符</param> public void UpdateDisplayText(string displayText) { using var bmp = new Bitmap(16, 16); using var g = Graphics.FromImage(bmp); // 透明背景 g.Clear(Color.Transparent); // 优化文本显示清晰度 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // 绘制文本,字体可按需调整 g.DrawString(displayText, new Font("Segoe UI", 9f, FontStyle.Regular), Brushes.White, 0, 0); // 替换托盘图标 _notifyIcon.Icon = Icon.FromHandle(bmp.GetHicon()); } /// <summary> /// 释放资源,程序退出时调用 /// </summary> public void Dispose() { _notifyIcon?.Dispose(); } } // 调用示例 internal class Program { static void Main(string[] args) { var trayHelper = new TrayTextHelper(); // 显示自定义文本ABC trayHelper.UpdateDisplayText("ABC"); // 保持进程运行 Application.Run(); // 退出时释放 trayHelper.Dispose(); } } }
方案2:自定义Desk Band(实现和ENG完全一致的位置效果)
如果需要和输入法标识完全同位置显示,需要实现Shell扩展的Desk Band组件:
- 实现
IDeskBand、IObjectWithSite、IPersistStream等Shell扩展必需的COM接口 - 使用管理员权限将开发好的COM组件注册到系统注册表
- 右键任务栏->工具栏->勾选你开发的自定义工具栏即可显示
注意事项
该方案开发成本较高,且Windows 11对Desk Band的兼容性弱于Windows 10,部分自定义主题可能出现显示异常。
内容的提问来源于stack exchange,提问作者C K
相关产品推荐
相关产品推荐

