Как изменить визуальную тему программно в Windows 8/8.1 по P / Invoking?

на C# или VB.Net, зная убиение визуальной темы .тема файл, я хотел бы применить эту визуальную тему в Windows,без в зависимости от других приложений, таких как программа rundll32.exe, просто P / Invoking, но избегая странных / странных вещей, таких как открытие окна персонализации, а затем использование

1 ответов


есть недокументированная функция с именем "SetSystemVisualStyle" описано на pinvoke.net это позволяет изменить текущий файл "msstyles". Поскольку эта функция недокументирована, она поставляется с оговоркой:"используйте на свой страх и риск".

следующие сигнатуры функций находятся на сайте, указанном выше.

подпись C#

[DllImport("UxTheme.Dll", EntryPoint = "#65", CharSet = CharSet.Unicode)]
public static extern int SetSystemVisualStyle(string pszFilename, string pszColor, string pszSize, int dwReserved);

использование:

// This will set your Visual Style to Luna
SetSystemVisualStyle(@"C:\WINDOWS\resources\Themes\Luna\Luna.msstyles", "Metallic", "NormalSize", 0);

VB.Net подпись

<DllImport("UxTheme.DLL", BestFitMapping:=False, CallingConvention:=CallingConvention.Winapi, CharSet:=CharSet.Unicode, EntryPoint:="#65")> _
Shared Function SetSystemVisualStyle(ByVal pszFilename As String, ByVal pszColor As String, ByVal pszSize As String, ByVal dwReserved As Integer) As Integer
End Function

ОП спросил, что к этому ответу следует добавить следующую информацию.

сама функция не изменяет должным образом некоторые цвета диалоговых окон и некоторые стили управления, когда тема третьей стороны применяется с пользовательским msstyles, но делает эксперимент, проверяя все возможные значения от 0 до Int32.Max, чтобы передать его зарезервированному параметру функции SetSystemVisualTheme, к моменту, когда я обнаружил, что значение 65 исправляет эту проблему раскрашивания и стилей.