Вопрос или проблема
Вопрос
В общем, я спрашиваю, как заставить SSD, вместо того чтобы позволять определенным окнам инструктировать DWM позволить им рендерить CSD для себя. Возможно ли это с использованием стандартного DWM оконного менеджера в Windows 11?
Примеры
-
CSD
С Windows 7 до 11, CSD включает в себя:
-
Новый тип оконной рамки, управляемый DWM в Windows 10 до 11. Это заменило компонент, который рисует предыдущие – как продемонстрировано, когда убивается
dwm.exe
.Если вы все еще не знаете, о каких я говорю, это те, что шириной в 1 логический пиксель, вместо тех, что имеют ширину, настраиваемую пользователем, видимые в Windows 8.1 и ниже (включая Aero и Classic).
-
Способность (особенно для приложений на основе XAML, таких как те, которые используют UWP и WinUI в Windows 8 до 11) рендерить пользовательский контент поверх / вместо стандартной панели заголовка, как это делают Steam и Epic Games Store.
-
-
SSD
В качестве примера SSD я использую KDE Plasma 5.27+, которая включила тот же тип оконной рамки. Это мой ответ на Quora объясняет, что принудить его рендерить (под X11) возможно с помощью
noborderrule=2
правила окон стандартного WM (KWin), поэтому я ожидаю, что DWM обладает аналогичными возможностями, учитывая его возраст (и, следовательно, многофункциональность).Вы можете увидеть это в приложениях этого тикета Bugzilla:
Обоснование
Новая оконная рамка меня устраивает, потому что позволяет мне легко определять, где начинается и заканчивается окно. Таким образом, я не хочу отключать их, как в этом ответе SU, и не хочу рендерить старые, как в этом ответе SU.
Тем не менее, это еще недостаточно, потому что любое окно, которое полностью определяет свой собственный CSD, как этот пример проекта на GitHub (в отличие от приложений на основе XAML на WinUI или Firefox) не рендерит их. Вы, вероятно, видели это в страшных диалоговых окон в стиле Windows 8, всё еще разбросанных по всей ОС.
Подтверждающие запросы
-
Негативные
github.com/mpv-player/mpv/issues/3646#issuecomment-297066378
(поreddit.com/r/linux/comments/7v8e9q/comment/dtq8v2e
)news.ycombinator.com/item?id=33162116
github.com/jellyfin/jellyfin-media-player/issues/40#issuecomment-821773023
news.ycombinator.com/item?id=34269299
forums.factorio.com/viewtopic.php?p=607328#p607328
bugs.kde.org/show_bug.cgi?id=452240#c0
-
Нейтральные
github.com/kovidgoyal/kitty/issues/3284#issuecomment-822539154
betaarchive.com/forum/viewtopic.php?p=452117&sid=8693be1145299e50bc19b6449a49e0c2#p452117
tenforums.com/customization/153759-windows-basic-style-win7-non-aero-theme-windows-10-a-2.html#post2169172
winclassic.net/thread/911/current-method-recent-win10-disable?page=1&scrollTo=7417
reddit.com/r/kde/comments/p5zlju
Когда это невозможно включить
-
GNOME 40 Mutter
К сожалению, ответ на это, похоже, специфичен для операционной системы, оконного менеджера, дисплейного сервера, композитора и соответствующих версий. В частности, использование Mutter как единого дисплейного сервера, оконного менеджера и композитора в данный момент невозможно из-за его преднамеренного отсутствия поддержки расширения XDG-Decoration протокола Wayland (который предоставляет SSD):
Нет планов по поддержке серверной декорации под Wayland, и это было бы шагом назад от пути, который мы выбрали с Wayland. Учитывая это, я собираюсь закрыть этот вопрос как не решенный.
-
KDE Plasma 6 Kwin
Кроме того, для альтернатив ситуация более сложная. В частности, для реализации KWin в Wayland эта функция (пока) преднамеренно недоступна. Однако, при использовании KWin просто как оконного менеджера, с пакетом стандартного XOrg 11, выступающим в роли дисплейного сервера и композитора (согласно
bugs.kde.org/show_bug.cgi?id=476996#c14
). -
Windows 10 и 11
dwm.exe
Конвейер рендеринга в Windows более сложный, чем в ОС на основе Linux, потому что он менее стандартизирован.
dwm.exe
предоставляет API для XAML (UWP и / или WinUI2)-приложений, в то время как более старые технологии (такие как VB6) могут проходить через значительно более низкоуровневые реализации, такие как GDI.По сути, это означает, что приложения, созданные с использованием технологий, которые поддерживают возврат к старым оконным декорациям (таким как “Aero” Windows <= 8 или классический возврат Windows NT) требуют от пользователя отключить
dwm.exe
и предотвратить ОС обнаруживать это, чтобы инициировать возврат к вышеупомянутым стилям оконных декораций. Кроме того, это также означает, что приложения, которые принципиально полагаются на CSD-функциональностьdwm.exe
, не смогут рендерить вообще (такие как UWP/WinUI приложения).
Когда это возможно
-
Kwin
Реализацию KWin можно активировать как “замену”, используя
noborderrule=2
выражение формата.ini
/.desktop
в файл.KWinRules
, когда он импортирован в и активирован с помощьюkcmshell6 kcm_kwinrules
. -
Windows 10+
Windows 10 и 11 удивительно похожи на KWin в этом отношении. Скрипт, который я разработал с использованием информации, указанной в библиографии вопроса, должен гарантировать, что оконные декорации всегда отрисовываются.
#!/usr/bin/env -S pwsh #Requires -RunAsAdministrator #Requires -PSEdition 'Core' #Requires -Version 7.4 If ($IsWindows) { # 1. Заменить `dwm.exe` на `rundll32.exe`. $ProcessPath = "$Env:SystemDrive\Windows\System32\dwm.exe" if (Test-Path $ProcessPath) { Rename-Item $ProcessPath 'dwm.exe.bak' New-Item -Path "$Env:SystemDrive\Windows\System32" -Name 'rundll32.exe' -ItemType 'File' -Force } # 2. Переименовать `Windows.UI.Logon.dll`. $LogonDLLPath = "$Env:SystemDrive\Windows\System32\Windows.UI.Logon.dll" if (Test-Path $LogonDLLPath) { Rename-Item $LogonDLLPath "Windows.UI.Logon.dll.bak" } # 3. Переименовать `$Env:SystemDrive\Windows\SystemApps` на что-то другое. $SystemAppsPath = "$Env:SystemDrive\Windows\SystemApps" if (Test-Path $SystemAppsPath) { Rename-Item $SystemAppsPath "$SystemAppsPath.bak" } # 4. Перезагрузить компьютер. Restart-Computer } Else { Exit 1 }
Тем не менее, это сделает реализацию оболочки
explorer.exe
(в первую очередьsihost2.exe
, отвечающую за панель задач) и все UWP приложения (рендерящиеся через XAML с помощьюdwm.exe
) полностью непригодными.Пример этого доступен по адресу
youtube.com/watch?v=1iXfUThaQ1Q
.
Ответ или решение
Чтобы заставить DWM (Desktop Window Manager) в Windows 11 использовать серверные декорации (SSD) для всех окон вместо клиентских декораций (CSD), необходимо понимать несколько ключевых аспектов работы DWM и ограничений Windows как операционной системы.
Понимание DWM и декораций окон
DWM отвечает за визуальные эффекты и использование прозрачности в Windows, что приводит к отрисовке окон с помощью методов, зависящих от приложений. Клиентские декорации позволяют разработчикам программного обеспечения определять внешний вид заголовка окна и границ, что дает возможность создания уникального стиля. Однако это также создает ситуацию, когда стандартные рамки Windows могут быть скрыты, оставляя интерфейс приложения только с его собственными элементами управления. Это и есть CSD.
Серверные декорации (SSD), с другой стороны, предоставляют более унифицированный и стандартный подход к отображению заголовков окон и границ, управляемых непосредственно системой, что улучшает взаимодействие пользователя с окнами.
Возможные решения для принудительного использования SSD
-
Изменение настроек системы: К сожалению, в Windows 11 нет стандартного способа принудительно заменить CSD на SSD, как это можно сделать в некоторых Linux окружениях (например, KWin с помощью
noborderrule=2
). Windows 10 и 11 имеют более жесткие ограничения в этом плане. -
Использование директорий DWM и изменения конфигураций:
a. Модификации через реестр:
Не существует прямого ключа реестра, который бы отключал CSD для всех окон. Однако некоторые параметры в реестре могут влиять на поведение интерфейса. Например, вы можете попробовать изменить параметры в разделеHKEY_CURRENT_USER\Control Panel\Desktop
и поэкспериментировать с различными значениями для ключей, связанных с темами и оттенками.b. Использование программных решений:
Существует специфический код и скрипты, которые могут изменять поведение DWM. Например, можно использовать PowerShell скрипт для изменения путей или функции, что может негативно сказаться на производительности системы (как указано в примере, приведенном в вопросе). Однако это приведёт к тому, что UWP-приложения и окна проводника будут неработоспособными. -
Отказ от DWM:
Полное отключение DWM приведёт к возврату к старику “Aero” и к другим более традиционным способам округления окон. С помощью командной строки или PowerShell можно отключить DWM, но это совсем не рекомендуется, так как приведет к более ранним версиям интерфейса Windows:Stop-Process -Name dwm -Force
-
Создание собственного движка декорации:
Если вам необходима полная настройка внешнего вида окон, возможно, стоит рассмотреть разработку собственного приложения, использующего Win32 API или другие графические интерфейсы, которые будут поддерживать ваши собственные SSD. Это, без сомнения, трудоемко и требует времени, но принципиально возможно.
Заключение
На данный момент Windows 11 не предоставляет простого решения для принудительного использования серверных декораций на всех окнах через стандартные настройки или API DWM. Существующие решения могут требовать значительных модификаций операционной системы и привести к непредсказуемым последствиям в работе приложений. Наилучшим вариантом будет следить за обновлениями от Microsoft по данному функционалу и использовать альтернативные методы, такие как пользовательские темы или собственные приложения, для достижения необходимых визуальных результатов.