Visual Studio 2010 - 半透明浮动窗口

7

在Visual Studio 2010中,是否可以制作半透明的浮动窗口?我想要能够浮动编辑器窗口并降低其alpha级别。是否可以通过修改默认编辑器窗口的扩展来创建此功能?

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

2个回答

5
主要问题在于,它取决于工具窗口,因为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实现。您可以在这个层次结构中更改许多内容,其中一些会起作用(例如Background属性),但是...关于透明度,我认为不可能,因为根窗口不允许它(它的AllowTransparency设置为false,并且一旦显示就无法更改)。例如设置Opacity = 0.5可以工作,但由于没有透明度,效果只是暗淡的窗口...

正如问题所述,这个问题涉及文档(编辑器)窗口。这也是我在上面设置悬赏的原因,因为解决这个问题可能会让我解决在http://stackoverflow.com/questions/4880186/visual-studio-2010-addin-which-makes-floating-window-non-topmost中的问题。 - Suma
我已经下载了UIA Verify并使用它来检查浮动文档窗口的属性。令我惊讶的是,该工具显示WindowPattern.Current.IsTopmost为false。至于透明度,我没有找到任何相关的内容。我过去做过一些MFC开发,但没有WPF,也不知道要寻找什么。 - Suma
@Suma - 我认为透明度的事情是不可能的(请看我的编辑)。然而,有些事情是可能的,比如自动定位框架。 - Simon Mourier
谢谢。我将授予悬赏,因为我认为这应该足以开始。我会在这里或链接的主题中发布任何进展。 - Suma
还有一个问题:您发布的代码是在哪里或如何执行的?在Visual Studio中,还是作为独立实用程序...? - Suma

0

1
我使用了这个扩展,但据我所知它似乎没有提供任何类似于透明度的功能。 - Nathan Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接