2011-07-09 13 views
5

Windows 7 viene con varios temas incorporados. Se puede acceder haciendo clic con el botón derecho en el escritorio y seleccionando Personalizar. En Personalizar, hay una sección que dice "Temas Aero" que contiene temas como "Arquitectura", "Naturaleza", etc.Cómo obtener el nombre del tema de Windows 7

He intentado usar el nombre GetCurrentThemeName de uxtheme.dll, pero en realidad está dando el nombre de estilo: "C: \ Windows \ resources \ Themes \ Aero \ Aero.msstyles" a menos que mi tema actual esté configurado en Windows Basic, en cuyo caso devuelve una cadena vacía. ¿Hay una API que realmente devuelva el nombre del tema, como "Naturaleza", "Arquitectura", etc.?

El código Probé es el siguiente:

[DllImport("uxtheme", ExactSpelling = true, CharSet = CharSet.Unicode)] 
public extern static Int32 GetCurrentThemeName(StringBuilder stringThemeName, 
    int lengthThemeName, StringBuilder stringColorName, int lengthColorName, 
    StringBuilder stringSizeName, int lengthSizeName); 

    StringBuilder stringThemeName = new StringBuilder(260); 
    StringBuilder stringColorName = new StringBuilder(260); 
    StringBuilder stringSizeName = new StringBuilder(260); 

    Int32 s = GetCurrentThemeName(stringThemeName, 260,stringColorName, 260,stringSizeName, 260); 
+1

encontré una clave del registro: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Temas de los cuales contiene una entrada: "CurrentTheme" que se rellena con el nombre de archivo de tema, no los estilos temáticos visuales como la API missnamed mencionado en mi original enviar. Por ejemplo, para el tema de la naturaleza, obtiene el valor: "C: \ Windows \ resources \ Themes \ nature.theme", que es realmente lo suficientemente bueno como para analizarlo y obtener el nombre. Por supuesto, habría un problema si el nombre del archivo del tema no coincide con el nombre de visualización del tema real en la interfaz de usuario, pero nunca abordaré ese caso en mi escenario limitado. – user577240

+1

Generalmente no es una buena idea acechar el registro ya que es más un detalle de implementación que otra cosa. Como [Brian Dishaw ha mencionado] (http://stackoverflow.com/questions/6631796/how-to-get-the-windows-7-theme-name/6632887#6632887), ['GetThemeDocumentationProperty()'] (http : //msdn.microsoft.com/en-us/library/bb773402.aspx) parece hacer lo que desea. –

+0

Gracias chicos. Eso es. – user577240

Respuesta

2

Después de echar un vistazo a la documentación de MSDN parece que GetThemeDocumentationProperty podría ser lo que buscas.

Usted querrá usarlo junto con el archivo de tema (que alreayd han encontrado en el registro), así como por los que pasa en el SZ_THDOCPROP_DISPLAYNAME como segundo parámetro del método.

Además aquí es un sitio que tiene el C# El método de envoltura para el p/invocar llamada: http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System.Windows.Forms/System/Windows/Forms/VisualStyles/UXTheme.cs.htm

Espero que ayude.

Cuestiones relacionadas