首页 > 解决方案 > 运行程序使用的Win10 Theme

问题描述

正在运行的程序是否有任何关于正在使用哪个 Win10 主题的信息?

我主要是为了获得更多的调试信息,因为我有一个用户报告了“加扰的 GUI”。

有没有办法从正在运行的程序中杀死主题或强制使用默认主题?

标签: delphidelphi-10.1-berlinwindows-10-desktop

解决方案


如果我正确理解了您的问题,我会建议您使用SetWindowTheme

您应该查看上面链接提供的信息,以查看docs.microsoft(前msdn)在部分中告诉我们的Remark内容:

当 pszSubAppName 和 pszSubIdList 为 NULL 时,主题管理器会删除先前应用的关联。您可以通过指定一个不匹配任何部分条目的空字符串 (L" ") 来防止将视觉样式应用于指定的窗口。

因此,考虑到这一点,您可以通过将两个参数设置为“大括号之间应该有空格Handle”来轻松地限制任何已知窗口的主题化。 SetWindowTheme

顺便说一句,我不强烈建议从您的应用程序中删除整个操作系统的主题。就个人而言,我删除了任何具有如此有用功能的软件。

重要的附录!

一段时间后,我再次阅读了您的问题,我可以回答您问题的第一部分。
您可以通过UXTheme单元获取主题信息。

首先,您必须使用这两个功能:

  1. 获取当前主题名称
  2. 获取主题文档属性

这是一些显示如何执行此操作的代码。

uses
  ..., UXTheme;

var
  ThemeName: Array[0..512] of Char;
  ThemeColorScheme: Array[0..512] of Char;
  ThemeSizeName: Array[0..512] of Char;
  PropertyName: Array[0..512] of Char;
begin
  UXTheme.GetCurrentThemeName(@ThemeName, SizeOf(ThemeName), @ThemeColorScheme, SizeOf(ThemeColorScheme), @ThemeSizeName, SizeOf(ThemeSizeName));
  UXTheme.GetThemeDocumentationProperty(@ThemeName, SZ_THDOCPROP_CANONICALNAME, @PropertyName, SizeOf(PropertyName));
end;  

请仔细阅读GetThemeDocumentationProperty- 此函数采用一个参数,该参数负责返回 OS 主题的哪些属性。根据docs.microsoft,上面代码中的标志SZ_THDOCPROP_CANONICALNAME将返回字符串属性

检索主题的名称。

因此,您将能够检查当前正在使用的主题。
但是您仍然可以为您自己的应用程序禁用主题。


推荐阅读