Visual Studio 2010 - 半透明浮动Windows

Nat*_*lor 7 transparency visual-studio-2010

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

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

Sim*_*ier 5

问题的主要原因在于,它取决于工具窗口,因为Visual Studio并未强制要求如何实际呈现工具窗口.

如果工具窗口中有要使用的HNWD,则可以使用SetLayeredWindowAttributes函数设置透明度.如果工具窗口是WPF,则可以使用其他技巧.

现在,问题是要抓住有用的东西......只需在Visual Studio 2010上启动SPY ++,你就会发现周围没有很多可见的HWND.有些软件包使用非托管代码,有些软件包使用.NET + Winforms,而且越来越多的软件包使用.NET + WPF.

UISpy(另一个间谍工具,但基于UI自动化)可以看到所有工具窗口,但它不显示任何Native WIndow Handle(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将给出一个WindowFrame实例列表.WindowFrame没有记录,但它是公共的(位于Microsoft.VisualStudio.Platform.WindowManagement.dll中),因此您可以使用它.每个WindowFrame实例都有一个具有Content属性的FrameView属性.在我的调查结果中,这个Content属性大部分时间都是WPF的Panel元素.该面板下面的层次结构将取决于窗口的实际实现方式.

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

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


Rya*_*nig 0

您检查过Visual Studio 颜色主题编辑器吗?如果它不能满足您的需要,也许您可​​以向作者请求该功能。