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

Alp*_*pay 23 c++ windows hook winapi

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

是否可以动态更改这些颜色(在整个过程范围内,或在系统范围内更改,除非可以进行整个过程的更改)?你能建议任何方法来达到这个目的吗?

我尝试了类似下面的东西,但它没有做我想要的:

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);
Run Code Online (Sandbox Code Playgroud)

提前致谢

编辑

这正是我想要的:

在此输入图像描述

小智 3

我知道你正在使用 C++,但我对 C# 很熟悉。为了让您有所了解,请查看以下修改表单外观的代码。

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("User32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    const int WM_NCPAINT = 0x85;
    if (m.Msg == WM_NCPAINT)
    {
        IntPtr hdc = GetWindowDC(m.HWnd);
        if ((int)hdc != 0)
        {
            Graphics g = Graphics.FromHdc(hdc);
            g.FillRectangle(Brushes.Green, new Rectangle(0, 0, 4800, 23));
            g.Flush();
            ReleaseDC(m.HWnd, hdc);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您还可以使用CodePlex 中的“在 Windows 窗体中绘制自定义边框”项目。该项目是一个小型库,允许用户自定义 Windows 窗体,例如自定义 Windows 的非客户端区域。

  • 免责声明:我没有投票。然而,我认为这个答案被击败的原因包括 **(a)** 无返回值。**(b)** 在绘制之前调用 DefWindowProc 的粗略等效项 - 这不会遮挡按钮吗?**(c)** 不引用通过 WM_NCPAINT 传递的 HRGN **(d)** 使用硬编码值作为要绘制的矩形大小(并且也在客户区域上绘制) **(e )** 代码确实与 C++ 代码非常不同,GDI+ Graphics 类的使用几乎是唯一的共同点。**(f)** 似乎是为你提供代表点,而不是为 OP 提供答案。 (2认同)