是否有办法更改非客户区的Windows Aero颜色?

是否有办法更改非客户区的Windows Aero颜色?,windows,winapi,user-interface,aero,Windows,Winapi,User Interface,Aero,我注意到Windows已经使Windows的非客户端区域自动成为主题的颜色-Windows Aero。我认为这是一个很好的想法,因为它使主题在各个程序中保持一致,并且有一个更好的界面。作为一个狡猾的人,我渴望颠覆微软在这里的意图,让一个GUI使用我的程序设置的颜色,而不是操作系统的设置 想法?是的,这是可能的,但您需要使用未记录的函数。这意味着您的程序可能无法在未来版本的Windows上运行,或者即使发布了service Pack或其他更新 如果您愿意承担风险,并对功能和使用方法进行反向工程。它

我注意到Windows已经使Windows的非客户端区域自动成为主题的颜色-Windows Aero。我认为这是一个很好的想法,因为它使主题在各个程序中保持一致,并且有一个更好的界面。作为一个狡猾的人,我渴望颠覆微软在这里的意图,让一个GUI使用我的程序设置的颜色,而不是操作系统的设置


想法?

是的,这是可能的,但您需要使用未记录的函数。这意味着您的程序可能无法在未来版本的Windows上运行,或者即使发布了service Pack或其他更新

如果您愿意承担风险,并对功能和使用方法进行反向工程。它包括您可以实现的屏幕截图:

基本上,您需要两个函数:
DwmGetColorizationParameters
DwmSetColorizationParameters
。传递给它们的结构和方法原型是(在Delphi中,但我确信如果你使用的是这个,你可以翻译成C++):

如果您不习惯这种语法,那么顶部部分定义一个结构,底部两行是方法原型。^表示指针,因此Set方法使用指向结构的指针。这意味着该方法也在使用指向该结构的指针<代码>过程表示返回void。如果你读起来仍然有困难,请留下评论,我会翻译成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;