2011-10-18 23 views
5

Yalnızca bir özel şekilli WPF penceresinin bir kısmına bir Aero arka plan bulanıklığı uygulamanız gerekiyor. Sorun, bulanıklığı DWM ile uygulamak için DwmEnableBlurBehindWindow işlevine bir pencere tanıtıcısı sağlamanız gerektiğidir.Bir WPF Popup kontrolünün Hwnd'ini almak mümkün mü?

WPF açılır penceresinin aslında ayrı bir pencere olduğu söylendi. Bu iyi. Bulanıklığı uygulamak için bir açılır pencerenin tutamacını alabilir miyim? Öyleyse nasıl?

cevap

8

bu

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

veya bu deneyin ama bu sadece gerçek Windows için çalışır, ancak gelecek referanslar için yardımcı olabilir.

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

Sen HwndSource.FromVisual 'için' myPopup.Child' geçmelidir() 'CLEBER yanıtında olduğu gibi. Aksi takdirde, Popup'un ebeveyni olan HwndSource'u alırsınız (Popup'un XAML'de bildirildiği ana pencerenizdir). Ama eğer 'myPopup.Child' iletirseniz, Popup tarafından oluşturulan bir pencere açılır. – nevermind

0

Özel bir sınıf adı var mı? Eğer öyleyse, pencere tanıtıcısını sınıf adıyla (FindWindow) bulabilirsiniz.

Windows'ta bu konulara gelince bir hacker tipine sahibim, bu yüzden genellikle "doğru" bir yöntem bulmaya çalışmak yerine ilk denememi yapıyorum. Benim için tüm eski şeyler, yine de, ben artık bunun pek çoğunu yapmıyorum - see blackbeltvb.com

Bunu yapmamın iki yolu 1) windows oluşturma mesajlarını kancalamak, o pop up penceresini izlemek sonra bir şey yapın (SetWindowsHookEx) ve 2) kullanılan tüm pencere tutamaçlarını numaralandırın, ardından yeni olanı izleyin.

8

bu deneyin:

<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; 
İlgili konular