Как я могу сказать, какую тему Windows я использую?
Я пытаюсь сделать мое приложение форсированной темой - это просто, как показано здесь: http://arbel.net/blog/archive/2006/11/03/Forcing-WPF-to-use-a-specific-Windows-theme.aspx
Однако я не знаю, какую тему я сейчас использую. Я использую тему Windows XP по умолчанию, что бы это ни было. Эта статья говорит
Важно указать версию и токен открытого ключа.
... где я могу получить эту информацию?
1 ответ
Чтобы получить имя темы, вы можете вызвать неуправляемый метод GetCurrentThemeName:
public string GetThemeName()
{
StringBuilder themeNameBuffer = new StringBuilder(260);
var error = GetCurrentThemeName(themeNameBuffer, themeNameBuffer.Capacity, null, 0, null, 0);
if(error!=0) Marshal.ThrowExceptionForHR(error);
return themeNameBuffer.ToString();
}
[DllImport("uxtheme.dll", CharSet=CharSet.Auto)]
public static extern int GetCurrentThemeName(StringBuilder pszThemeFileName, int dwMaxNameChars, StringBuilder pszColorBuff, int dwMaxColorChars, StringBuilder pszSizeBuff, int cchMaxSizeChars);
Вы можете найти маркер версии и открытого ключа, щелкнув правой кнопкой мыши по теме.dll (например, PresentationFramework.Aero) в GAC (откройте c:\Windows\Assembly в Exporer), или вы можете использовать код для этого. Просто переберите все загруженные сборки с помощью AppDomain.CurrentDomain.LoadedAssemblies и найдите тот, который вам нужен:
foreach(Assembly a in AppDomain.CurrentDomain.LoadedAssemblies)
if(a.Name.StartsWith("PresentationFramework."))
return a.FullName;
Обратите внимание, что цикл по загруженным сборкам также сообщит вам имя текущей темы, если в текущем домене приложений была загружена только одна тема.