我创造我自己的智能感知主讲,由于Visual Studio2012支持变化的主题,所以我希望在主题已经改变了我对主持人的背景颜色可以自动改变。 有没有一种方法来跟踪主题更改事件,或者拿到的Visual Studio当前的颜色主题?
Answer 1:
是的,这是可能的。 我不得不解决一个类似的问题,我的扩展......目前的主题存储在Windows注册表中的一个; 所以我采取了以下实用工具类。
public enum VsTheme
{
Unknown = 0,
Light,
Dark,
Blue
}
public class ThemeUtil
{
private static readonly IDictionary<string, VsTheme> Themes = new Dictionary<string, VsTheme>()
{
{ "de3dbbcd-f642-433c-8353-8f1df4370aba", VsTheme.Light },
{ "1ded0138-47ce-435e-84ef-9ec1f439b749", VsTheme.Dark },
{ "a4d6a176-b948-4b29-8c66-53c97a1ed7d0", VsTheme.Blue }
};
public static VsTheme GetCurrentTheme()
{
string themeId = GetThemeId();
if (string.IsNullOrWhiteSpace(themeId) == false)
{
VsTheme theme;
if (Themes.TryGetValue(themeId, out theme))
{
return theme;
}
}
return VsTheme.Unknown;
}
public static string GetThemeId()
{
const string CategoryName = "General";
const string ThemePropertyName = "CurrentTheme";
string keyName = string.Format(@"Software\Microsoft\VisualStudio\11.0\{0}", CategoryName);
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName))
{
if (key != null)
{
return (string)key.GetValue(ThemePropertyName, string.Empty);
}
}
return null;
}
}
好的; 这只是有助于FIGUR出当前设置...监听主题改变通知是有点棘手。 你的包被加载后,你必须获得通过DTE的IVsShell实例; 一旦你有了这个对象,你可以利用AdviceBroadcastMessages方法认购事件通知。 你必须提供一个对象,其类型实现了IVsBroadcastMessageEvents接口...
我不希望后整个执行,但下面的行可能说明了关键的场景......
class VsBroadcastMessageEvents : IVsBroadcastMessageEvent
{
int IVsBroadcastMessageEvent.OnBroadcastMessage(uint msg, IntPtr wParam, IntPtr lParam)
{
const uint WM_SYSCOLORCHANGE = 0x15;
if (msg == WM_SYSCOLORCHANGE)
{
// obtain current theme from the Registry and update any UI...
}
}
}
考虑该类型实现IDisposable的为好,以便能够从事件源退订,当包被卸载。
这是如何订阅事件通知...
class ShellService
{
private readonly IVsShell shell;
private bool advised;
public ShellService(IVsShell shellInstance)
{
this.shell = shellInstance;
}
public void AdviseBroadcastMessages(IVsBroadcastMessageEvents broadcastMessageEvents, out uint cookie)
{
cookie = 0;
try
{
int r = this.shell.AdviseBroadcastMessages(broadcastMessageEvents, out cookie);
this.advised = (r == VSConstants.S_OK);
}
catch (COMException) { }
catch (InvalidComObjectException) { }
}
public void UnadviseBroadcastMessages(uint cookie)
{
...
}
}
保持cookie的参数值; you'll需要它成功退订。
希望帮助( - :
Answer 2:
只是想让以防万一别人走来的更新.. @Matze和@Frank是完全正确的。但是在2015年VS ..他们增加了一个简单的方法来检测主题改变。 所以,你需要包括PlatformUI的dyou得到一个超级简单的事件
using Microsoft.VisualStudio.PlatformUI;
....
//Then you get an event
VSColorTheme.ThemeChanged += VSColorTheme_ThemeChanged;
你应该确保你的控制是一次性的,所以你可以从事件退订...
奖金!
它也给你方便地访问到的颜色..即使用户已经从默认改变了他们..所以设置你的颜色时,你可以在做这样的东西
var defaultBackground = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowBackgroundColorKey);
var defaultForeground = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowTextColorKey);
Answer 3:
对于2015年VS这种情况已经改变,该解决方案@Matze有仍然有效,但你需要更新GetThemeId()函数来检查版本,如果它是14.0(VS2015)在注册表中的一个不同的地方看看。 被存储的值也改变了,它仍然是一个字符串,但现在包含一个“*”分隔的其他值。 主题GUID是在列表中的最后一个值。
if (version == "14.0")
{
string keyName = string.Format(@"Software\Microsoft\VisualStudio\{0}\ApplicationPrivateSettings\Microsoft\VisualStudio", version);
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName))
{
if (key != null)
{
var keyText = (string)key.GetValue("ColorTheme", string.Empty);
if (!string.IsNullOrEmpty(keyText))
{
var keyTextValues = keyText.Split('*');
if (keyTextValues.Length > 2)
{
return keyTextValues[2];
}
}
}
}
return null;
}
文章来源: How to get current used color theme of Visual Studio