You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分ARGB值相同的Black与ActiveCaptionText两种系统颜色?

结论

如果你只有单独的ARGB int数值,无法直接区分这两个颜色,因为默认系统主题下二者的ARGB值完全一致,数值层面没有任何差异。

如果你的业务需要区分「标准色」和「系统主题关联的颜色」,可以参考下面的方案:

方案1:持有Color对象时直接判断

如果你的数据源可以保留Color对象而非仅存储ARGB int值,可以直接使用Color结构自带的两个属性区分:

  • IsSystemColor:判断该颜色是否属于系统主题关联的颜色
    • Color.FromName("Black").IsSystemColor 返回 false
    • Color.FromName("ActiveCaptionText").IsSystemColor 返回 true
  • KnownColor:直接获取该颜色对应的KnownColor枚举值,无需自行映射。

方案2:仅持有ARGB int值时自定义优先级映射

如果你只能拿到ARGB int值,可以自行构建映射字典,根据业务需求设置名称返回优先级:

  • 如果你希望优先返回标准色名,遇到相同ARGB时返回Black
  • 如果你希望优先返回系统主题色名,遇到相同ARGB时返回ActiveCaptionText

示例代码如下:

// 构建优先级映射,这里演示优先匹配标准色
Dictionary<int, string> argb2NameMap = new Dictionary<int, string>();

// 先加入所有非系统的标准色,优先级更高
foreach (KnownColor kc in Enum.GetValues<KnownColor>())
{
    Color color = Color.FromKnownColor(kc);
    if (!color.IsSystemColor && !argb2NameMap.ContainsKey(color.ToArgb()))
    {
        argb2NameMap[color.ToArgb()] = kc.ToString();
    }
}

// 再加入系统颜色,已存在的ARGB不覆盖
foreach (KnownColor kc in Enum.GetValues<KnownColor>())
{
    Color color = Color.FromKnownColor(kc);
    if (color.IsSystemColor && !argb2NameMap.ContainsKey(color.ToArgb()))
    {
        argb2NameMap[color.ToArgb()] = kc.ToString();
    }
}

// 使用示例
int inputArgb = -16777216;
if (argb2NameMap.TryGetValue(inputArgb, out string colorName))
{
    Console.WriteLine(colorName); // 输出 Black
}

补充说明

你现在测试得到二者ARGB相等只是默认系统主题的情况,如果用户手动修改了系统主题的标题栏文本颜色,ActiveCaptionText的ARGB值会发生变化,此时和Black的返回值就会不同。

内容的提问来源于stack exchange,提问作者Vlad Sandu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:27:04