2012-06-11 48 views

回答

4

有两种方法,使用IVSShell和IVSShell2:

private List<Color> GetColorList1() 
    { 
     IVsUIShell uiShell = (IVsUIShell)this.GetService(typeof(IVsUIShell)); 

     List<Color> result = new List<Color>(); 

     foreach (VSSYSCOLOR vsSysColor in Enum.GetValues(typeof(VSSYSCOLOR))) 
     { 
      uint win32Color; 
      uiShell.GetVSSysColor(vsSysColor, out win32Color); 
      Color color = ColorTranslator.FromWin32((int)win32Color); 
      result.Add(color); 
     } 

     return result; 
    } 

    private List<Color> GetColorList2() 
    { 
     IVsUIShell2 uiShell = (IVsUIShell2)this.GetService(typeof(IVsUIShell2)); 

     List<Color> result = new List<Color>(); 

     foreach (__VSSYSCOLOREX vsSysColor in Enum.GetValues(typeof(__VSSYSCOLOREX))) 
     { 
      uint win32Color; 
      uiShell.GetVSSysColorEx((int)vsSysColor, out win32Color); 
      Color color = ColorTranslator.FromWin32((int)win32Color); 
      result.Add(color); 
     } 

     return result; 
    } 
0

我意识到这实际上是一个答案。

要检索什么不被IVsUIShell4及以下

我想这添加到我的knowlege的Visual Studio 2005 - 2010年甚至不必每说主题曝光。至少Visual Studio 2012改变了这个机制。你可以加载设置文件,但它们不是每个说的主题。

Microsoft.VisualStudio.Shell.Interop甚至没有require枚举。

+0

是的,但我知道,你可以改变VS2010主题,所以主题必须在任何地方,注册表配置文件?这是我的问题。 –

2

我找到了一个解决方案:

[Guid("0D915B59-2ED7-472A-9DE8-9161737EA1C5")] 
interface SVsColorThemeService 
{ 
} 

则:

dynamic colorThemeService = _serviceProvider.GetService(typeof(SVsColorThemeService)); 
Guid id = colorThemeService.CurrentTheme.ThemeId; 
// should be one of the Microsoft.VisualStudio.Shell.KnownColorThemes 
+0

使用没有成员但没有IntelliSense帮助的界面有点令人不安,但这似乎适用于我(VS 2015)。 – webjprgm

+1

此界面在此处可用:https://msdn.microsoft.com/en-us/library/microsoft.internal.visualstudio.shell.interop.svscolorthemeservice(v=vs.110).aspx – JoshVarty

+0

_serviceProvider从哪里来? – cyanbeam