Głównym problemem jest to, że zależy to od okna narzędzia, ponieważ Visual Studio nie ma dużego wpływu na sposób renderowania okna narzędzia.
Jeśli okno narzędzia ma HNWD do zabawy, możesz ustawić przezroczystość za pomocą funkcji SetLayeredWindowAttributes. Jeśli okno narzędzia to WPF, możesz użyć innych sztuczek.
Problem polega na tym, aby uzyskać coś pożytecznego ... Wystarczy uruchomić SPY ++ w Visual Studio 2010, a zobaczysz, że nie ma zbyt wielu widocznych HWND. Niektóre pakiety używają niezarządzanego kodu, niektóre pakiety używają .NET + WinForm, a coraz więcej, ostatnie pakiety używają .NET + WPF.
UISpy (kolejne narzędzie szpiegiem, ale na podstawie UI Automation) widzi wszystkie okna narzędziem, ale nie wykazują żadnych Native uchwyt okna (jeden ze standardowych nieruchomości, które może odczytać automatyki UI), który nie jest dobrą wiadomością.
Visual Studio używa interfejsu IVsWindowPane, a konkretnie metody CreatePaneWindow do utworzenia okna hosta, ale nic nie jest oficjalne, aby można było odzyskać uchwyt HWND.
Hmm! Jeśli masz konkretne okno narzędzi, które chcesz poprawić, możemy mieć głębszy wygląd, ale myślę, że trudno jest napisać 100% ogólne narzędzie.
EDYTOWANIE: Szukałem więcej. Oto kod, który wylicza wszystkie okna klatek (zadokowany lub pływające) bieżącego programu Visual Studio przykład:
// 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;
}
}
To da listę instancji okienna. WindowFrame nie jest udokumentowany, ale jest publiczny (znajduje się w Microsoft.VisualStudio.Platform.WindowManagement.dll), więc możesz z niego korzystać. Każda instancja WindowFrame ma właściwość FrameView z właściwością Content. Ta właściwość Zawartość jest, w większości przypadków z moich ustaleń, elementem Panelu WPF. Hierarchia pod tym panelem będzie wtedy zależna od sposobu wdrożenia okna.
Jeśli jest to plik niezarządzany lub WinForm (na przykład edytor .SQL), w kolekcji dla dzieci w panelu będzie dostępny HwndHost. Próbowałem grać z tym (przy użyciu SetLayeredWindowAttributes), ale to nie wydaje się działać ...
Jeśli jest to WPF (przykład, nowy edytor C#/VB), będzie ogromny hiearchy WPF, które ostatecznie doprowadzą do implementacji IWfpTextView. Możesz zmienić wiele rzeczy w tej hierarchii, a niektóre będą działać (np. Własność Background), ale ... jeśli chodzi o przezroczystość, nie sądzę, że jest to możliwe, ponieważ okno główne nie pozwala na to (ma zestaw AllowTransparency na false i nie można go zmienić po wyświetleniu). Ustawienie Opacity = 0,5 na przykład działa, ale ponieważ nie ma przezroczystości, efektem są po prostu przyciemnione okna ...
Użyłem tego rozszerzenia i nie wydaje mi się, aby oferowało coś w rodzaju przezroczystości z tego, co potrafię powiedzieć. –