2011-10-18 9 views
5

Muszę zastosować rozmycie tła Aero tylko w części niestandardowego okna WPF. Problem polega na tym, że aby zastosować rozmycie z DWM, muszę dostarczyć uchwyt okna do funkcji DwmEnableBlurBehindWindow.Czy można uzyskać wartość Hwnd kontrolki okna podręcznego WPF?

Powiedziano mi, że wyskakujące okienko WPF jest w rzeczywistości oddzielnym oknem. To jest dobre. Czy mogę uzyskać uchwyt popup, aby zastosować do niego rozmycie? Jeśli tak to jak?

Odpowiedz

8

Spróbuj

HwndSource source = (HwndSource)HwndSource.FromVisual(myPopup) 

lub tego, ale ten działa tylko dla rzeczywistego systemu Windows, ale może pomóc w przyszłych odniesień.

IntPtr handle = new WindowInteropHelper(myWindow).Handle; 
+1

Należy zdać 'myPopup.Child' do' HwndSource.FromVisual() 'jak w odpowiedzi na Cleber. W przeciwnym razie otrzymasz rodzic HwndSource of Popup (który jest twoim nadrzędnym oknem, gdzie Popup został zadeklarowany w XAML). Ale jeśli przekażesz 'myPopup.Child', otrzymasz okno utworzone przez Popup. – nevermind

0

Czy ma niestandardową nazwę klasy? Jeśli tak, możesz znaleźć uchwyt okna poprzez nazwę klasy (FindWindow).

Jestem trochę typem hakera, jeśli chodzi o te rzeczy w systemie Windows, więc to jest to, co zwykle próbuję najpierw, zamiast próbować odkryć "właściwą" metodę. Wszystkie stare rzeczy dla mnie, jednak, nie robię już tego zbyt wiele - zobacz blackbeltvb.com

Dwa inne sposoby, które to zrobiłem to 1), aby zawiesić wiadomości do tworzenia okien, uważaj na to wyskakujące okno , zrób coś z tym (SetWindowsHookEx) i 2) wylicz wszystkie używane klamki okienne, a następnie obejrzyj nowe.

8

Spróbuj tego:

<Popup Name="MyPop" IsOpen="True" Height="50" Width="50"> 
    <!--or other control--> 
    <Rectangle/> 
</Popup> 


// only after MyPop.IsOpen is true 
IntPtr handle = ((HwndSource)PresentationSource.FromVisual(MyPop.Child)).Handle; 
Powiązane problemy