Заголовок окна 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. Насколько я знаю, вы должны иметь возможность настроить цвет строки заголовка.

Конечный результат может выглядеть примерно так:

Другие вопросы по тегам