【发布时间】:2011-04-26 02:32:22
【问题描述】:
是否可以在 Visual Studio 2010 中使浮动窗口半透明?我希望能够浮动编辑器窗口并降低其上的 alpha 级别。是否可以使用修改股票编辑器窗口的扩展来创建此功能?
如果不是扩展,是否有体面的第三方应用程序能够修改 Visual Studio 2010 中特定子窗口的属性?
【问题讨论】:
标签: visual-studio-2010 transparency
是否可以在 Visual Studio 2010 中使浮动窗口半透明?我希望能够浮动编辑器窗口并降低其上的 alpha 级别。是否可以使用修改股票编辑器窗口的扩展来创建此功能?
如果不是扩展,是否有体面的第三方应用程序能够修改 Visual Studio 2010 中特定子窗口的属性?
【问题讨论】:
标签: visual-studio-2010 transparency
您查看Visual Studio Color Theme Editor 了吗?如果它不能满足您的需求,您可以向作者请求该功能。
【讨论】:
主要问题在于,它取决于工具窗口,因为 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 有效,但由于没有透明度,所以效果只是变暗的窗口...
【讨论】: