我注意到Windows已经使Windows的非客户区自动成为主题的颜色--Windows Aero。我认为这是一个好主意,因为它使主题在程序和一个通常更好的界面上保持一致。作为一个狡猾的个人,我渴望在这里颠覆微软的意图并获得一个使用我的程序设置颜色而不是操作系统设置的GUI。
思想?
答案 0 :(得分:6)
是的,这是可能的,但您需要使用未记录的功能。这意味着您的程序可能无法在未来的Windows版本上运行,或者即使发布了Service Pack或其他更新。
如果您愿意承担风险,this blog post has full details并反向设计功能以及如何使用它们。它包括您可以实现的屏幕截图:
基本上,您需要两个功能:DwmGetColorizationParameters
和DwmSetColorizationParameters
。传递给它们的结构和方法原型是(在Delphi中,但我相信如果你正在使用的话,你可以转换为C ++):
tagCOLORIZATIONPARAMS = record
clrColor : COLORREF; //ColorizationColor
clrAftGlow : COLORREF; //ColorizationAfterglow
nIntensity : UINT; //ColorizationColorBalance -> 0-100
clrAftGlowBal : UINT; //ColorizationAfterglowBalance
clrBlurBal : UINT; //ColorizationBlurBalance
clrGlassReflInt : UINT; //ColorizationGlassReflectionIntensity
fOpaque : BOOL;
end;
COLORIZATIONPARAMS=tagCOLORIZATIONPARAMS;
TColorizationParams=COLORIZATIONPARAMS;
PColorizationParams=^TColorizationParams;
TDwmGetColorizationParameters = procedure(out parameters :TColorizationParams); stdcall;
TDwmSetColorizationParameters = procedure(parameters :PColorizationParams; unknown:BOOL); stdcall;
如果您不熟悉该语法,则顶部定义结构,底部两行是方法原型。 ^表示指针,因此Set方法采用指向结构的指针。 out
is tricky并且意味着该方法也是指向结构的指针。 procedure
表示它返回void。如果您仍然无法阅读它,请发表评论,我将翻译为C.
您应该能够从中找出所需的一切,但如果您想了解更多详细信息或使用它的示例,请read the blog post。 (这是一个很棒的帖子,应该得到流量。)