Обнаружить темную windows панель задач - PullRequest
1 голос
/ 24 марта 2020

Для тематических целей я хочу определить цвет панели задач Windows (в моем случае, для иконки в трее).

Я использую Java, но любые решения добро пожаловать, так как я с радостью конвертирую их по мере необходимости.

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

    • Это работает даже при включенном автоматическом скрытии. К сожалению, он возвращает черный фон независимо от того, что я делаю:

        WinDef.HWND tray = User32.INSTANCE.FindWindow("Shell_TrayWnd", null);
        BufferedImage bi = GDI32Util.getScreenshot(tray);
        SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(null, new JLabel((new ImageIcon(bi)))));
      

      enter image description here

Предполагая, что я не не хотите полагаться на белый / черный цвет Windows lo go, есть ли способ обнаружить это?

Похожие:

Ответы [ 2 ]

1 голос
/ 25 марта 2020

До сих пор я не сталкивался с отсутствием SystemUsesLightTheme и AppsUseLightTheme в реестре.

Но я думаю, что воссоздание значений ключа стоит попробовать.

Вот Пример кода (C ++):

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <Windows.h>

using namespace std;


int main() {


    HKEY key;
    if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"), &key) != ERROR_SUCCESS)
    {
        cout << "unable to open registry";
    }

    DWORD value_data = 0;

    if (RegSetValueEx(key, TEXT("SystemUsesLightTheme"), 0, REG_DWORD, (const BYTE*)&value_data, sizeof(value_data)) != ERROR_SUCCESS)
    {
        RegCloseKey(key);
        cout << "Unable to set registry value value_name";
    }
    else
    {
        cout << "value_name was set" << endl;
    }

}
0 голосов
/ 10 апреля 2020

Если документированные записи реестра отсутствуют, появляется сообщение что-то в ОС закодировано для восстановления следующих настроек :

  • Если AppsUseLightTheme отсутствует, предположим, что это 1
  • Если SystemUsesLightTheme отсутствует, предположим, что это 0

Хотя fre sh Windows Home устанавливает по умолчанию тему Light, эти fre * Установщики 1048 * также правильно устанавливают ключи реестра, поэтому сочетание отсутствующего ключа реестра и легкой панели задач крайне маловероятно (и, вероятно, невозможно). Аналогично, изучение современных ОС может - неправильно - предположить, что значения по умолчанию взяты из файла C:\Windows\resources\Themes\aero.theme**, но не обманывайте себя! В старых ОС тоже не было отличительной записи ... Подробнее ниже.


Детали славы ...

Инстинкт подсказывает, что CurrentTheme или, возможно, InstallTheme значения реестра будут служить в качестве нормального запасного значения, но изменение этих значений, по-видимому, предназначено для исторических целей и, по-видимому, фактически не меняет светлую / темную тему.

reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes /v InstallTheme
>>> returns the path to aero.theme

type %SystemRoot%\resources\Themes\aero.theme |find "SystemMode"
>>> returns SystemMode=dark

Даже при изменении InstallTheme для вся машина (HKEY_LOCAL_MACHINE) не изменяет это поведение, предпочитая SystemMode=dark (обратите внимание, что даже эта запись не была доступна в более старых Windows 10 версиях. Например, Windows 10 v1507 не имеет этого запись в файле темы тоже).

Погоня за aero.theme тоже зашла в тупик. Попытка напрямую изменить aero.theme не удалась из-за разрешений, но при копировании aero.theme на рабочий стол и изменении SystemMode=dark на SystemMode=light и последующем двойном щелчке файла темы панель задач go станет белой, но только на более новых Windows версии, которые поддерживали светлую тему.

Итак, да, я должен согласиться с @ strive-sun-msft, запись реестра SystemUsesLightTheme - лучшее место. При тестировании, даже панель задач сама контролирует это, удаление его сбрасывает его обратно в черный цвет. К сожалению, этот запасной черный цвет панели задач остается загадкой. Я могу только предположить, что он жестко запрограммирован в самой панели задач.

Другой обходной путь для такого поведения - просто установите файл aero.theme еще раз, запустив его, если записи реестра отсутствуют. В более новых версиях Windows 10 простой запуск этого файла приведет к отсутствию записей. К сожалению, это не работает на более старых Windows 10 версиях и хуже, это сбросит любые пользовательские настройки, установленные пользователем.

Так что наименее навязчивый способ определения цвета панели задач - это прочитать реестра и если ключи отсутствуют, просто предположим, что тема Windows 10, поставляемая с, все еще действует: Темная панель задач, Светлая Windows.

...