有效字幕文本颜色 – 检测变化(在.Net中)

在Vista上,启用了Aero后,标准模式下的窗口标题为黑色文字(写在轻微的玻璃杯上),而最大化标题为白色(写在黑色玻璃上)。

我怎样才能确定窗口标题的当前颜色

PS我写了一个程序来观看SystemColors.ActiveCaptionTextColor后,但在两种模式下保持不变。

系统颜色实际上并没有改变。 你所看到的是Aero 主题在窗口中的应用。 有主题API可以抓住主题特定的颜色,但我的经验一直不如恒星使用它们。

从注释更新:看看VisualStyleRenderer和GetColor方法。

我不能让VisualStyleRenderer告诉我任何事情。

您可以选择:

  • VisualStyleElement.Window.Caption.Active
  • VisualStyleElement.Window.MaxCaption.Active

因为MaxCaption 最大化窗口的标题栏的每个状态提供了VisualStyleElement对象。

除了它实际上不工作。 如果您要求激活最大化窗口的标题文本颜色:

 VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Window.MaxCaption.Active); Color c = renderer.GetColor(ColorProperty.TextColor); 

它返回黑色CaptionMaxCaption

事实上,两者之间几乎所有的颜色都是一样的:

替代文字http://img.zgserver.com/windows/3994h.png

我的猜测是,没有办法让你的应用程序具有与操作系统相同的外观和感觉。

你为什么不尝试在窗体中监听SystemColorsChanged事件?

  SystemColorsChanged += new EventHandler(Form1_SystemColorsChanged); void Form1_SystemColorsChanged(object sender, EventArgs e) { //try repainting or refreshing your application } 

我知道这不是确切的解决方案,但你可以从这里开始工作。

关于基于VisualStyleRenderer的建议,可能值得注意的是,出于性能原因,显然最大化的窗口标题由Vista DWM(桌面窗口管理器)专门处理,请参阅Raymond Chen对某些细节的解释 。

现在,我还没有偷看到Aero主题本身,但它可能实际上为正常和最大化的标题定义了相同的TextColor,后者只是没有被DWM使用。

这就是说,我会猜想Vista中的字幕文本颜色的确是由VisualStyleElement.Window.Caption.Active为主题的正常窗口,但前者SystemColors.ActiveCaptionTextColor为最大化窗口; 不幸的是,你已经发现,事实并非如此。

所以也许DWM只是在渲染最大化的窗口标题时应用内部默认值? 如果是这种情况,则无法检测字幕文本颜色是否按设计改变,而是需要依据观察最大化的窗口状态,并在本地应用DWM默认值。