【问题标题】:Visual Studio 2010 - Semi-Transparent Floating WindowsVisual Studio 2010 - 半透明浮动窗口
【发布时间】:2011-04-26 02:32:22
【问题描述】:

是否可以在 Visual Studio 2010 中使浮动窗口半透明?我希望能够浮动编辑器窗口并降低其上的 alpha 级别。是否可以使用修改股票编辑器窗口的扩展来创建此功能?

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

【问题讨论】:

    标签: visual-studio-2010 transparency


    【解决方案1】:

    您查看Visual Studio Color Theme Editor 了吗?如果它不能满足您的需求,您可以向作者请求该功能。

    【讨论】:

    • 我已经使用了这个扩展程序,但据我所知,它似乎没有提供任何类似于透明度的东西。
    【解决方案2】:

    主要问题在于,它取决于工具窗口,因为 Visual Studio 并没有过多地规定工具窗口的实际呈现方式。

    如果工具窗口有 HNWD 可供使用,您可以使用 SetLayeredWindowAttributes 函数设置透明度。如果工具窗口是WPF,你可以使用其他技巧。

    现在,问题是要掌握一些有用的东西...只需在 Visual Studio 2010 上启动 SPY++,您就会发现周围没有多少可见的 HWND。一些包使用非托管代码,一些包使用 .NET + Winforms,最近的包越来越多地使用 .NET + WPF。

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

    Visual Studio 使用 IVsWindowPane 接口,特别是 CreatePaneWindow 方法来创建宿主窗口,但没有任何官方可以让任何 HWND 句柄重新使用。

    嗯!如果你有一个特定的工具窗口要调整,我们可以更深入地了解,但我认为很难编写一个 100% 通用的工具。

    编辑:我进行了更多搜索。下面是枚举当前 Visual Studio 实例的所有窗口框架(停靠或浮动)的代码:

    // 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 属性,该属性具有一个 Content 属性。根据我的发现,这个 Content 属性大部分时间是 WPF 的 Panel 元素。然后,该面板下方的层次结构将取决于窗口的实际实现方式。

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

    如果它是一个 WPF(例如,全新的 C#/VB 编辑器),将会有一个巨大的 WPF 层次结构,最终将归结为 IWfpTextView 实现。你可以在这个层次结构中改变很多东西,有些东西会起作用(比如背景属性),但是......关于透明度,我认为这是不可能的,因为根窗口不允许它(它有@987654327 @设置为false,一旦显示就无法更改)。例如设置 Opacity = 0.5 有效,但由于没有透明度,所以效果只是变暗的窗口...

    【讨论】:

    • 正如问题所说,关注的是文档(编辑器)窗口。这也是我开始赏金的原因,因为解决这个问题可能会让我在stackoverflow.com/questions/4880186/… 中解决我的问题
    • 我已经下载了 UIA Verify 并用它来检查浮动文档窗口的属性。令我惊讶的是,该工具将 WindowPattern.Current.IsTopmost 显示为假。至于透明度,我没有找到任何相关的东西。我过去做过一些 MFC 开发,但没有 WPF,我不知道要寻找什么。
    • @Suma - 我不认为透明的事情是可能的(见我的编辑)。但是,有些事情是可能的,例如自动定位框架。
    • 谢谢。我正在奖励赏金,因为我认为这应该足以开始。我将在此处或链接的主题中发布任何进一步的进展。
    • 还有一个问题:您发布的代码,这是打算在哪里或如何执行的?在 Visual Studio 内部,或作为独立实用程序...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多