以编程方式设置标题栏和边框颜色

时间:2015-08-31 11:36:33

标签: c++ windows winapi hook

我正在尝试以编程方式更改应用程序的标题栏和边框颜色。我尝试了很多东西,但没有成功,并决定在整个系统中更改这些颜色。因为我可以在应用程序运行时更改标题栏和边框颜色,并在应用程序结束时将其还原。 (托管环境,运行少量应用程序)

是否可以动态更改这些颜色(整个过程或整个系统,除非可以进行全过程的更改)?你能提出任何方法来实现这个目标吗?

我尝试了类似下面的内容,但它没有做我想要的事情:

int aElements[2] = {COLOR_WINDOW, COLOR_ACTIVECAPTION};
DWORD aOldColors[2];
DWORD aNewColors[2];

aOldColors[0] = GetSysColor(aElements[0]); 
aOldColors[1] = GetSysColor(aElements[1]); 
aNewColors[0] = RGB(0x80, 0x80, 0x80);  // light gray 
aNewColors[1] = RGB(0x80, 0x00, 0x80);  // dark purple 

SetSysColors(2, aElements, aNewColors);
SetSysColors(2, aElements, aOldColors);

提前致谢

修改

这正是我想要的:

enter image description here

2 个答案:

答案 0 :(得分:4)

我不建议自定义边框和标题重绘。 以正确的方式去做真的很难。 Office只是在客户区域中自行绘制所有内容,但使用普通边框。 使用NC_PAINT正确的方法是一种痛苦,可能会引入闪烁。 特别是定位最小化,最大化和关闭按钮很困难,因为每个窗口都有不同的方式。 还要考虑辅助功能,使用较大的字体,自定义用户设置。

改变颜色的目的是什么?

要更改全局颜色,至少要分开代码

//在你的应用程序启动时调用一次(例如在WM_CREATE中)

SetSysColors(2, aElements, aNewColors); 

//关闭应用程序时调用此方法(例如在WM_DESTROY中)

SetSysColors(2, aElements, aOldColors); 

答案 1 :(得分:2)

删除第二个SetSysColors(2,aElements,aOldColors);代码行,它恢复为原始颜色,然后再试一次。您拥有的代码示例似乎与MSDN链接https://msdn.microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx链接减去睡眠几乎完全相同。他们的例子展示了如何设置颜色,睡眠然后恢复。