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

zettend

Старожил
Здравствуйте.
Возможно будет отследить тему(светлая/тёмная)?
И как можно это провернуть:

Если(black) то:
bg: 'bg__black.png'
button: 'btn__black.png'
Если(white) то:
bg: 'bg.png'
button: 'btn.png'
Если(не удалось обнаружить) то:
white

Ну и соответственно вставить:
MainBg := ImgLoad(WizardForm.Handle, bg, ScaleX(0), ScaleY(0), ScaleX(780), ScaleY(390), True, True);
 

Shegorat

Lord of Madness
Администратор
Гениальный и в то же время бессмысленный по своему содержимому вопрос.
Какую темы вы хотите отслеживать? Инсталлятора? Системы? Или ещё что-то?
 

zettend

Старожил
Гениальный и в то же время бессмысленный по своему содержимому вопрос.
Какую темы вы хотите отслеживать? Инсталлятора? Системы? Или ещё что-то?
Тему Windows. Как мы знаем, в Win 10 добавили смену темы(тёмная/светлая):
Снимок экрана 2020-05-03 в 17.59.56.png
 

Nemko

Дилетант
Модератор
Incorrect, через реестр можно чекнуть, с помощью "AppsUseLightTheme" ключа по пути HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize. Советую загуглить, у меня нет Windows 10.
 

zettend

Старожил
Incorrect, через реестр можно чекнуть, с помощью "AppsUseLightTheme" ключа по пути HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize. Советую загуглить, у меня нет Windows 10.
А возможно ли как то в реальном времени меня тему? Грубо говоря нужен такой эффект -
 

MarsBar

Новичок
А возможно ли как то в реальном времени меня тему? Грубо говоря нужен такой эффект -
Если на счёт реального времени, то можно создать поток и проверять каждую секунду например какой параметр в реестре, на C# сделал за 2 минуты программу, которая изменяет значение лейбла в зависимости от темы
 
Последнее редактирование:

MarsBar

Новичок
Если интересует вот пример на c#, тут пару конструкций условных убрать можно, но мне было лень, пример рабочий
C#:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ChangeTheme
{
    public partial class CheckingTheme : Form
    {
        public string check;
        public string check2;
        public string FormBackgroundColor;
        public CheckingTheme()
        {
            InitializeComponent();

            Checkk();
            changingColor();

            System.Timers.Timer myTimer = new System.Timers.Timer();
            myTimer.Start();
            myTimer.Elapsed += async (o, e) =>
            {
                await Task.Run(() =>
                {
                    Checkk();
                    changingColor();
                });
            };
        }
        public void Checkk()
        {
            string subKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize";
            check = ReadFromRegistry("AppsUseLightTheme", subKey);
            check2 = ReadFromRegistry("SystemUsesLightTheme", subKey);

            if (int.Parse(check) == 1 && int.Parse(check2) == 1)
                FormBackgroundColor = "Light";
            else
                FormBackgroundColor = "Dark";
        }
        public static string ReadFromRegistry(string keyName, string subKey)
        {
            RegistryKey sk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subKey);
            if (sk == null) return null;
            else return sk.GetValue(keyName.ToUpper()).ToString();
        }
        public void changingColor()
        {
            if (FormBackgroundColor == "Light")
                this.BackColor = Color.White;
            else if (FormBackgroundColor == "Dark")
                this.BackColor = Color.Black;
        }
    }
}
 

El Sanchez

Новичок
А возможно ли как то в реальном времени меня тему?
Форматирование (BB-код):
const
  WM_SETTINGCHANGE = $001A;

function SetWindowSubclass(hWnd: HWND; pfnSubclass, uIdSubclass, dwRefData: LongWord): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass, uIdSubclass: LongWord): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: LongWord): LongWord; external 'DefSubclassProc@comctl32.dll stdcall';

var
  GWndProc: LongWord;
  GAppsUseLightTheme: Boolean;

procedure HandleLightTheme;
begin
  GAppsUseLightTheme := True;
  MsgBox('Light', mbInformation, MB_OK);
end;

procedure HandleDarkTheme;
begin
  GAppsUseLightTheme := False;
  MsgBox('Dark', mbInformation, MB_OK);
end;

function WndProc(hWnd: HWND; uMsg: UINT; wParam, lParam, uIdSubclass, dwRefData: LongWord): LongWord;
var
  LAppsUseLightTheme: DWORD;
begin
  case uMsg of
    WM_SETTINGCHANGE:
      begin
        if (CompareText(CastIntegerToString(lParam), 'ImmersiveColorSet') = 0) and
          RegQueryDWordValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'AppsUseLightTheme', LAppsUseLightTheme) then
        begin
          if (LAppsUseLightTheme = 1) and not GAppsUseLightTheme then
            HandleLightTheme
          else if (LAppsUseLightTheme = 0) and GAppsUseLightTheme then
            HandleDarkTheme;
        end;
        Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
      end;
  else
    Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
  end;
end;

function InitializeSetup: Boolean;
var
  LAppsUseLightTheme: DWORD;
begin
  Result := True;
  if GetWindowsVersion > $0A004500 then
    if RegQueryDWordValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'AppsUseLightTheme', LAppsUseLightTheme) then
      GAppsUseLightTheme := LAppsUseLightTheme = 1
    else
      GAppsUseLightTheme := False;
end;

procedure InitializeWizard;
begin
  if GetWindowsVersion > $0A004500 then
  begin
    if GWndProc = 0 then
      GWndProc := {#ifdef IS_ENHANCED}CallbackAddr('WndProc'){#else}CreateCallback(@WndProc){#endif};
    SetWindowSubclass(WizardForm.Handle, GWndProc, 0, 0);
  end;
end;

procedure DeinitializeSetup;
begin
  if GetWindowsVersion > $0A004500 then
  begin
    if ExpandConstant('{wizardhwnd}') = '0' then Exit;
    RemoveWindowSubclass(WizardForm.Handle, GWndProc, 0);
  end;
end;
 

MarsBar

Новичок
Форматирование (BB-код):
const
  WM_SETTINGCHANGE = $001A;

function SetWindowSubclass(hWnd: HWND; pfnSubclass, uIdSubclass, dwRefData: LongWord): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass, uIdSubclass: LongWord): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: LongWord): LongWord; external 'DefSubclassProc@comctl32.dll stdcall';

var
  GWndProc: LongWord;
  GAppsUseLightTheme: Boolean;

procedure HandleLightTheme;
begin
  GAppsUseLightTheme := True;
  MsgBox('Light', mbInformation, MB_OK);
end;

procedure HandleDarkTheme;
begin
  GAppsUseLightTheme := False;
  MsgBox('Dark', mbInformation, MB_OK);
end;

function WndProc(hWnd: HWND; uMsg: UINT; wParam, lParam, uIdSubclass, dwRefData: LongWord): LongWord;
var
  LAppsUseLightTheme: DWORD;
begin
  case uMsg of
    WM_SETTINGCHANGE:
      begin
        if (CompareText(CastIntegerToString(lParam), 'ImmersiveColorSet') = 0) and
          RegQueryDWordValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'AppsUseLightTheme', LAppsUseLightTheme) then
        begin
          if (LAppsUseLightTheme = 1) and not GAppsUseLightTheme then
            HandleLightTheme
          else if (LAppsUseLightTheme = 0) and GAppsUseLightTheme then
            HandleDarkTheme;
        end;
        Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
      end;
  else
    Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
  end;
end;

function InitializeSetup: Boolean;
var
  LAppsUseLightTheme: DWORD;
begin
  Result := True;
  if GetWindowsVersion > $0A004500 then
    if RegQueryDWordValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'AppsUseLightTheme', LAppsUseLightTheme) then
      GAppsUseLightTheme := LAppsUseLightTheme = 1
    else
      GAppsUseLightTheme := False;
end;

procedure InitializeWizard;
begin
  if GetWindowsVersion > $0A004500 then
  begin
    if GWndProc = 0 then
      GWndProc := {#ifdef IS_ENHANCED}CallbackAddr('WndProc'){#else}CreateCallback(@WndProc){#endif};
    SetWindowSubclass(WizardForm.Handle, GWndProc, 0, 0);
  end;
end;

procedure DeinitializeSetup;
begin
  if GetWindowsVersion > $0A004500 then
  begin
    if ExpandConstant('{wizardhwnd}') = '0' then Exit;
    RemoveWindowSubclass(WizardForm.Handle, GWndProc, 0);
  end;
end;
Круто! Ещё и проверку версии системы прикрутил, я об этом не подумал.
 
Сверху