别再混淆你的 RDP 会话:自动标记 Remote Desktop 窗口

发布: (2025年12月12日 GMT+8 15:57)
6 min read
原文: Dev.to

Source: Dev.to

每位系统管理员都深有体会的问题

你打开了 8 个远程桌面窗口。一个是 PROD-DB,一个是 TEST-APP,还有一个是本地开发机。它们看起来一模一样。你需要重启一个服务……却点错了窗口。

生产环境宕机了。

听起来很熟悉吧?原生 Windows MSTSC 客户端并不会给出视觉提示。虽然可以把鼠标悬停在任务栏上查看主机名,但在快速操作时,错误仍然会发生。

“老派”解决办法(以及它为什么糟糕)

大多数管理员会采用:

  • 编辑远程机器的主机名,在其中加入 [PROD][TEST]
  • 使用第三方 RDP 管理器,如 mRemoteNG 或 RD Tabs
  • 极度小心(剧透:根本不管用)

但如果还能继续使用 原生 MSTSC 客户端,同时获得即时的视觉反馈呢?

介绍:RDP Title Master

RDP Title Master 是一个体积极小的后台实用工具,它:

  • 实时监控所有 RDP 窗口
  • 将窗口标题与自定义规则(IP 地址、主机名)匹配
  • 在 MSTSC 工具栏上直接叠加一个 颜色编码的徽章

注:我在构建此工具后转向 macOS,所以没有截图可分享。如果你尝试了,请在评论中贴出截图——我很想看到它的实际效果!😅

示例配置 (settings.json)

[
  {
    "Pattern": "prod",
    "Label": "🔥 PRODUCTION",
    "ColorHex": "#e74c3c"
  },
  {
    "Pattern": "192.168",
    "Label": "🏠 LOCAL",
    "ColorHex": "#2ecc71"
  },
  {
    "Pattern": "test",
    "Label": "🧪 TEST",
    "ColorHex": "#3498db"
  }
]

当你连接到 prod-db-01.company.com 时,工具栏会立即显示一个 红色徽章,文字为 “PRODUCTION”。再也不用猜测了。

工作原理(技术深度解析)

1. 窗口检测

工具使用 EnumWindows 扫描所有顶层窗口,寻找 RDP 窗口类:

private static bool IsRdpWindow(IntPtr hwnd)
{
    string className = GetClassName(hwnd);
    return className == "TscShellContainerClass";
}

2. 标题匹配

找到 RDP 窗口后,获取其标题(通常包含主机名或 IP),并与配置的模式进行匹配:

string title = GetWindowTitle(hwnd);
var rule = _configs.FirstOrDefault(c =>
    title.Contains(c.Pattern, StringComparison.OrdinalIgnoreCase)
);

3. GDI+ 叠加层

我们创建一个带有抗锯齿文字和圆角徽章背景的透明位图,然后通过 UpdateLayeredWindow 应用:

using (Graphics g = Graphics.FromImage(bmp))
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

    // Draw rounded rectangle badge
    FillRoundedRectangle(g, bgBrush, badgeRect, 10);

    // Draw text on top
    g.DrawString(text, font, textBrush, x, y);
}

4. 守护进程模式

程序以无限循环运行(每 3 秒一次),检查新出现的 RDP 窗口。这意味着你只需在早上启动一次,随后就可以忘记它。

为什么选 C# 而不是 Python/PowerShell?

简短回答: 性能和分发。

  • 单个 .exe – 无运行时依赖。下载即用。
  • GDI+ 质量 – 原生访问 Windows 图形 API,渲染流畅。
  • 体积 – 开启裁剪后,最终二进制约 50 MB(自包含 .NET 8)。

最初的原型是用 Python 编写的(仍在仓库的 legacy_python/ 文件夹中),但 C# 让它达到了生产级别。

安装与使用

快速开始

  1. GitHub 下载最新发行版。
  2. 编辑 settings.json,填入你的服务器模式。
  3. 运行 MstscTitleBar.exe
  4. 打开任意 RDP 会话,即可看到魔法效果。

从源码构建

git clone https://github.com/mlanies/mstsc_title_bar.git
cd mstsc_title_bar/MstscTitleBar
dotnet run

生成可移植可执行文件:

dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true

实际使用场景

1. 多环境管理

如果你管理 DEV/STAGE/PROD 环境,可以用颜色进行区分:

  • 🔴 红色 = Production(危险区)
  • 🟡 黄色 = Staging(请谨慎)
  • 🟢 绿色 = Dev(随意实验)

2. 客户划分

为多个客户服务的顾问可以使用如下模式:

{ "Pattern": "client-a", "Label": "Client A", "ColorHex": "#9b59b6" }
{ "Pattern": "client-b", "Label": "Client B", "ColorHex": "#f39c12" }

3. 数据中心识别

按地理位置标记服务器:

{ "Pattern": "us-east", "Label": "🇺🇸 Virginia", "ColorHex": "#3498db" }
{ "Pattern": "eu-west", "Label": "🇪🇺 Ireland", "ColorHex": "#2ecc71" }

已知限制

  • 仅限窗口模式 – 全屏 RDP 会隐藏工具栏(设计如此)。
  • Windows 10/11 – 使用了针对现代 Windows 的 WinAPI 调用。
  • 刷新延迟 – 3 秒轮询间隔(可在代码中自行修改)。

想贡献代码?欢迎提交 PR!

结论

如果你曾在错误的终端输入 rm -rf /,或重启了错误的服务器,你一定体会到视觉提示的价值。RDP Title Master 是一个零配置、极简的工具,让你的日常工作更安全。

试一试吧,并在评论中告诉我你的使用感受!

GitHub:

Back to Blog

相关文章

阅读更多 »

继续编码

介绍 我们都有这样的日子:本以为是个简单的修改去修复一个 bug,结果却花了一整天的时间去解决它。如果…