如何获取Visual Studio当前使用的颜色主题 [英] How to get current used color theme of Visual Studio

查看:158
本文介绍了如何获取Visual Studio当前使用的颜色主题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于Visual Studio2012支持更改主题,因此我正在创建自己的IntelliSense Presenter,因此我希望可以在更改主题时自动更改演示者的背景色.是否可以跟踪主题更改事件或获取Visual Studio的当前颜色主题?

I'm creating my own IntelliSense Presenter, since Visual Studio2012 support change theme, so I want my background color of the presenter can be auto-changed when the theme been changed. Is there a way to track the theme changes event, or get the current color theme of the Visual Studio?

推荐答案

是的,这是可能的.我不得不用我的一个扩展程序解决一个类似的问题... 当前主题存储在Windows注册表中.所以我实现了以下实用程序类.

Yes, this is possible. I had to solve a similiar issue with one of my extensions... The current theme is stored in the Windows Registry; so I implemented the following utility class.

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;
    }
}

好吧;这只是有助于弄清楚当前的设置...监听主题更改通知有点棘手.加载包后,必须通过DTE获取IVsShell实例;一旦有了该对象,就可以利用AdviceBroadcastMessages方法订阅事件通知.您必须提供一个对象,该对象的类型必须实现IVsBroadcastMessageEvents接口...

Okay; this just helps to figur out the current settings... listening for the theme changed notification is a bit trickier. After your package is loaded, you must obtain an IVsShell instance via the DTE; once you have this object you can utilize the AdviceBroadcastMessages method to subscribe for event notifications. You have to provide an object whose type implements the IVsBroadcastMessageEvents interface...

我不想发布整个实现,但是以下几行可能会说明关键方案...

I don´t want to post the whole implementation, but the following lines might illustrate the key scenario...

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,以便在卸载程序包时能够从事件源退订.

Consider implementing IDisposable on that type as well, in order to be able to unsubscribe from the event source, when the package gets unloaded.

这就是我订阅事件通知的方式...

This is how I subscribe for event notifications...

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参数的值;您需要它才能成功退订.

Keep the value of the cookie parameter; you´ll need it to successfully unsubscribe.

希望有帮助(-:

这篇关于如何获取Visual Studio当前使用的颜色主题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆