Темная тема Win10 - как использовать в WINAPI? - PullRequest
0 голосов
/ 27 ноября 2018

Начиная с October 2018 Update (version 1809) Win10 поддерживает темную тему в проводнике Windows.

Здесь можно настроить:

  • Пользовательский интерфейс: Desktop | Context Menu | Personalize | Colors | Choose your default app mode = Dark
  • Реестр: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme = DWORD:0

Хотя этот параметр существует некоторое время, он влияет только на приложения UWP.Тем не менее, с этим выпуском Windows 10, это также влияет на Windows Explorer, который является настольным приложением.Это означает, что в Windows теперь есть внутренняя поддержка.Тем не менее, приложения для настольных компьютеров, отличные от Windows Explorer, на данный момент не затронуты.

Я бы хотел использовать его в своем приложении.Как это реализовано под капотом?Есть ли способ (манифест, WINAPI и т. Д.) Подписаться на новую темную тему?

Обновление 1:
Я заметил, что панель управления Windows Explorer частично светлая и частично темная,таким образом, это должна быть настройка для каждого окна, а не для процесса.

Еще один пример: диалоговые окна «Открыть файл» становятся темными во всех настольных приложениях, а само приложение остается в старой светлой теме.

Обновление 2:
Я пробовал SetWindowTheme(hwnd, L"Explorer", NULL); для TreeView и ListView.Это заметно меняет стиль TreeView (+ кнопка расширения становится V), но окно остается белым.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

После некоторых копаний я смог найти эти два подхода.Оба документа не имеют документов и могут быть изменены без предварительного уведомления.

1

SetWindowTheme(hwnd, L"DarkMode_Explorer", NULL);

2

using TYPE_AllowDarkModeForWindow = bool (WINAPI *)(HWND a_HWND, bool a_Allow);
static const TYPE_AllowDarkModeForWindow AllowDarkModeForWindow = (TYPE_AllowDarkModeForWindow)GetProcAddress(hUxtheme, MAKEINTRESOURCEA(133));
AllowDarkModeForWindow(a_HWND, true);
SetWindowTheme(hwnd, L"Explorer", NULL);

ВНИМАНИЕ: У Ordinal 133 может быть совершенно другой API в других версиях Windows, включая более новые / более старые сборки Win10.

Оба подхода применяют некоторые эффекты, но не все.
Например, TreeView получает темные полосы прокрутки и темный фон для выбранного элемента, но остальной фон остается по умолчанию.

К сожалению, пока это не похоже на "вызов функции и все".Кажется, что даже при правильной теме некоторые цвета фона должны обрабатываться вручную.

0 голосов
/ 28 ноября 2018

Я не уверен, хотите ли вы применить тему к своему приложению или просто включить темную тему в своем приложении.

для первого, вы можете использовать SetWindowTheme(hwndList, L"Explorer", NULL); Это может датьпоявление списка Windows Explorer.

для 2-го, вот значение ключа в реестре: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme для управления темой.значение = 1 означает свет;значение = 0, означает темный;используйте api реестра для установки значения:

#include<iostream>
#include <windows.h>
int main()
{
    HKEY hKey;
    long setRes;
    DWORD dwValue = 1;
    setRes = RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_SET_VALUE, &hKey);
    if (setRes != ERROR_SUCCESS)
    {
        printf("Failed, error %d\n", setRes);
        return -1;
    }
    setRes = RegSetValueExA(hKey, "AppsUseLightTheme", NULL, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));
    if (setRes != ERROR_SUCCESS)
    {
        printf("Failed, error %d\n", setRes);
        return -1;
    }
    RegCloseKey(hKey);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...