Заголовок окна WPF
Я просмотрел эту статью о том, как получить строку заголовка «темный режим» в строке заголовка winforms WinForms Dark в Windows 10 .
очевидно, что вы можете получить такой дескриптор окна (в WPF) вместо использования this.Handle
IntPtr hWnd = new WindowInteropHelper(GetWindow(this)).EnsureHandle();
Так это работает
Но мне было интересно, смогу ли я сделать это с любым цветом.
В Windows 10 и 11 есть настройка для включения любого цвета заголовка в настройках, но мне было интересно, могу ли я получить hWnd и сделать это самостоятельно для каждого приложения, поскольку я могу сделать его черным, почему не любой другой цвет?
2 ответа
Люди хотели увидеть, как я заставил это работать
Поместите это в свой класс
[DllImport("DwmApi")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
const int DWWMA_CAPTION_COLOR = 35;
в любой функции (основной?)
получить дескриптор окна или hwnd, как это
IntPtr hWnd = new WindowInteropHelper(this).EnsureHandle();
затем определить цвет
int[] colorstr = new int[]{0xFF00FF};
строка 0x отформатирована следующим образом: 0xRRGGBB заменяет буквы на соответствующие значения
тогда сделай это
DwmSetWindowAttribute(hWnd, DWWMA_CAPTION_COLOR, colorstr, 4);
примечание: это работает только в Windows 11
вот полная версия если лень
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);
}
}
ах да, и импортировать их
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
Редактировать: цвет идет в формате BGR, поэтому убедитесь, что он идет синий, зеленый, красный, а не красный, зеленый синий
У вас есть три подхода к этой проблеме...
1: Самое сложное, что вы пытаетесь сделать, это изменить неклиентскую область, которая контролируется Windows.
Недостатком является то, что это возможно только с помощью методов ядра Windows, и вы находитесь в .NET, а не в C/C++. Однако есть в нашем распоряжении. Действительно, весь пользовательский интерфейс Windows Form и методы ввода-вывода консольных приложений предлагаются в виде оболочек, которые выполняют системные вызовы под капотом. Следовательно, как задокументировано в MSDN, вполне возможно использовать
P/Invoke
для доступа к тем методам, которые необходимы для настройки неклиентской области.
Как было сказано ранее, это решение «более сложное, чем необходимо в настоящее время».
2. Более простой вариант — создание собственной строки заголовка с помощью XAML.
К счастью, начиная с .NET 4.5, вы можете использовать класс для настройки неклиентской области в соответствии с вашими потребностями, вы можете установить
WindowStyle
на none и может добавить пользовательскую строку заголовка в ваше приложение, которая может иметь любой цвет, который вам нравится, и может выглядеть как строка заголовка из Windows или другой ОС.
Чтобы начать с себя
WindowChrome
вы можете перейти к следующим статьям Класс WindowChrome и Эксперименты с WindowChrome.
Основа вашего кода прямо под
<Window [...]>
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="0"
ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>
И обязательно добавьте
WindowStyle="None"
удалить заголовок и его компоненты
3: Самый простой, с использованием сторонней библиотеки.
Вы также можете использовать стороннюю систему компонентов, например MahApps.Metro для WPF. Насколько я знаю, вы должны иметь возможность настроить цвет строки заголовка.
Конечный результат может выглядеть примерно так: