Reputation: 174
I've looked in this article about getting "dark mode" titlebar in winforms WinForms Dark title bar on Windows 10
its obvious you can get the window handle like this (In WPF) instead of using this.Handle
IntPtr hWnd = new WindowInteropHelper(GetWindow(this)).EnsureHandle();
So it works
But I was wondering if I could do this with any color..
Windows 10 and 11 have a setting to turn on any titlebar color in settings, but I was wondering if I could get the hWnd and do this myself per application, since I can turn it to black, why not any other color?
Upvotes: 2
Views: 4032
Reputation: 174
People have been wanting to see how I got this to work
Put this under your class
[DllImport("DwmApi")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
const int DWWMA_CAPTION_COLOR = 35;
in whatever function (main?)
get the window handle or hwnd like this
IntPtr hWnd = new WindowInteropHelper(this).EnsureHandle();
then define the color
int[] colorstr = new int[]{0xFF00FF};
the 0x string thing is formatted like this 0xRRGGBB replace the letters to their corresponding values
then make it happen
DwmSetWindowAttribute(hWnd, DWWMA_CAPTION_COLOR, colorstr, 4);
note: this only works in windows 11
here is the complete version if your lazy
class MainWindow : Window
{
[DllImport("DwmApi")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
const int DWWMA_CAPTION_COLOR = 35;
public MainWindow()
{
IntPtr hWnd = new WindowInteropHelper(this).EnsureHandle();
int[] colorstr = new int[]{0xFF00FF};
DwmSetWindowAttribute(hWnd, DWWMA_CAPTION_COLOR, colorstr, 4);
}
}
oh yes and import these
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
Edit: the color goes in the BGR format, so make sure it goes blue, green, red and not red, green blue
Upvotes: 5
Reputation: 501
You can take three approaches to this problem...
1: The hard one, what you are trying to do is modify the non-client area which is controlled by Windows.
The downside is this is possible only through the Windows' kernel methods, and you're in .NET, not C/C++. However, there is P/Invoke
at our disposal. Indeed, the whole of the Windows Form UI and console application I/O methods are offered as wrappers that make system calls under the hood. Hence, as documented in MSDN, it is completely possible to use P/Invoke
to access those methods that are needed to set up the non–client area.
As said prior, this is a "harder than currently necessary" solution.
2: The easier one, making your own title bar with XAML
Luckily, as of .NET 4.5, you can use the WindowChrome
class to adjust the non-client area somewhat to your needs, you can set the WindowStyle
to none and can add a custom title bar to your application that can have any color you like, and can look like the title bar from Windows or other OS'
To get yourself started on WindowChrome
you can go to these following articles WindowChrome Class and Experiments with WindowChrome.
The basis of your code right below the <Window [...]>
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="0"
ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>
And make sure you add WindowStyle="None"
to remove the titlebar and its components
3: The easiest one, using a third-party library.
You can also use a third-party components system like MahApps.Metro for WPF. You should be able to Customize the title bar color as far as I am aware.
The end result can look something like this:
Upvotes: 3