2012-06-11 52 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