代码之家  ›  专栏  ›  技术社区  ›  Nathan Taylor

Visual Studio 2010-半透明浮动窗口

  •  7
  • Nathan Taylor  · 技术社区  · 15 年前

    Visual Studio 2010中的浮动窗口是否可以半透明?我希望能够浮动一个编辑器窗口,并降低其alpha级别。这个功能是否可以通过修改股票编辑器窗口的扩展来创建?

    如果不是扩展,是否有合适的第三方应用程序能够在Visual Studio 2010中修改特定子窗口的属性?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Simon Mourier    15 年前

    问题的主要原因是,它取决于工具窗口,因为VisualStudio并不要求太多关于工具窗口的实际渲染方式。

    如果工具窗口有HNWD可供使用,则可以使用 SetLayeredWindowAttributes 作用如果工具窗口是WPF,则可以使用其他技巧。

    现在,问题是要抓住一些有用的东西。。。只要在VisualStudio2010上启动SPY++,你就会看到周围没有多少可见的HWND。有些包使用非托管代码,有些包使用。NET+Winforms,以及越来越多的最新软件包使用。NET+WPF。

    UISpy (另一个间谍工具,但基于 UI Automation )可以看到所有工具窗口,但它没有显示任何本机窗口句柄(UI automation可以读取的标准属性之一),这不是好消息。

    Visual Studio使用IVsWindowPane界面,特别是 CreatePaneWindow 方法来创建主机窗口,但没有任何官方文件可以让任何HWND句柄返回使用。

    隐马尔可夫模型!如果你有一个特定的工具窗口,你想调整,我们可以有一个更深入的研究,但我认为很难编写一个100%通用工具。

    编辑 当前位置我搜索得更远了。下面是一段代码,用于枚举当前Visual Studio实例的所有windows框架(固定或浮动):

    // WindowFrame needs Microsoft.VisualStudio.Platform.WindowManagement.dll
    public static IEnumerable<WindowFrame> EnumWindowFrames(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp, __WindowFrameTypeFlags frameTypes)
    {
        if (sp == null)
            throw new ArgumentNullException("sp");
    
        ServiceProvider serviceProvider = new ServiceProvider(sp);
        IVsUIShell4 shell = (IVsUIShell4)serviceProvider.GetService(typeof(SVsUIShell)); // VS 2010 only
    
        IEnumWindowFrames framesEnum;
        IVsWindowFrame[] frames = new IVsWindowFrame[1];
        uint numFrames;
        shell.GetWindowEnum((uint)frameTypes, out framesEnum);
        if (framesEnum == null)
            yield break;
    
        while ((framesEnum.Next(1, frames, out numFrames) == VSConstants.S_OK) && (numFrames == 1))
        {
            WindowFrame frame = frames[0] as WindowFrame;
            if (frame != null)
                yield return frame;
        }
    }
    

    这将给出WindowFrame实例的列表。WindowFrame没有文档记录,但它是公共的(位于Microsoft.VisualStudio.Platform.WindowManagement.dll中),因此您可以使用它。每个WindowFrame实例都有一个具有内容属性的FrameView属性。从我的发现来看,这个内容属性大多数时候是WPF的Panel元素。该面板下面的层次结构将取决于窗口的实际实现方式。

    如果是非托管或Winforms(例如.SQL编辑器),则面板的子集合中将有一个HwndHost。我试着玩它(使用 SetLayeredWindowAttributes ),但它似乎不起作用。。。

    如果它是一个WPF(例如,全新的C#/VB编辑器),那么将有一个巨大的WPF层次结构,它最终将成为一个 IWfpTextView 实施在这个层次结构中,你可以改变很多东西,有些可以工作(比如后台属性),但是。。。关于透明度,我认为这是不可能的,因为根窗口不允许它(它有 AllowTransparency 设置为false,一旦显示就无法更改)。例如,将“不透明度”设置为0.5是可行的,但由于没有透明度,效果只是使窗口变暗。。。

        2
  •  0
  •   RyanHennig    15 年前

    你退房了吗 Visual Studio Color Theme Editor ? 如果它不能满足你的需要,也许你可以向作者索取该功能。