2010-10-15 15 views
7

Czy można uczynić pływające okna w Visual Studio 2010 półprzezroczyste? Chciałbym móc unieść okno edytora i zmniejszyć poziom alfa na nim. Czy ta funkcja może zostać utworzona z rozszerzeniem, które modyfikuje okno edytora fotografii?Visual Studio 2010 - półprzezroczyste pływające okna

Jeśli nie rozszerzenie, czy istnieją przyzwoite aplikacje stron trzecich, które byłyby w stanie modyfikować właściwości określonych okien potomnych w Visual Studio 2010?

Odpowiedz

0

Czy wymeldowałeś się Visual Studio Color Theme Editor? Jeśli nie zrobi tego, czego potrzebujesz, możesz poprosić o funkcję autora.

+1

Użyłem tego rozszerzenia i nie wydaje mi się, aby oferowało coś w rodzaju przezroczystości z tego, co potrafię powiedzieć. –

5

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 ...

+0

Zgodnie z pytaniami, problem dotyczy okien dokumentu (edytora). Jest to również powód, dla którego rozpocząłem nagrodę, ponieważ rozwiązanie tego prawdopodobnie pozwoliłoby mi rozwiązać mój problem na http://stackoverflow.com/questions/4880186/visual-studio-2010-addin-which-makes- pływający-okno-nie najwyższy – Suma

+0

Pobrałem UIA Verify i użyłem go do sprawdzenia właściwości okna swobodnego dokumentu. Ku mojemu zaskoczeniu narzędzie pokazuje WindowPattern.Current.IsTopmost jako false. Jeśli chodzi o przejrzystość, nie znalazłem nic z tym związanego. W przeszłości robiłem trochę rozwoju MFC, ale nie mam WPF i nie wiem, czego szukać. – Suma

+0

@Suma - Nie sądzę, że jest to możliwe (patrz moja edycja). Jednak niektóre rzeczy są możliwe, na przykład automatyzacja pozycjonowania ramek. –

Powiązane problemy