2011-10-18 4 views
5

Devo applicare uno sfocatura dello sfondo Aero solo a una parte di una finestra WPF personalizzata. Il problema è che per applicare la sfocatura con DWM, è necessario fornire un handle di finestra alla funzione DwmEnableBlurBehindWindow.È possibile ottenere l'Hwnd di un controllo Popup WPF?

Mi è stato detto che il controllo popup di WPF è in realtà una finestra separata. È buono. Posso ottenere l'handle di un popup per applicare la sfocatura ad esso? Se é cosi, come?

risposta

8

Prova questa

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

o questo, ma questo si lavora solo per effettiva di Windows, ma potrebbe aiutare per i riferimenti futuri.

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

si dovrebbe passare 'myPopup.Child' a' HwndSource.FromVisual() 'come nella risposta di Cleber. Altrimenti ottieni HwndSource del genitore di Popup (che è la tua finestra genitore, dove Popup è stato dichiarato in XAML). Ma se passi 'myPopup.Child' otterrai una finestra creata dal Popup. – nevermind

0

Ha un nome di classe personalizzato? In tal caso, puoi trovare l'handle della finestra tramite il nome della classe (FindWindow).

Sono un po 'un tipo di hacker quando si tratta di questa roba in Windows, quindi è quello che di solito provo prima, piuttosto che cercare di scoprire un metodo "corretto". Tutte le vecchie cose per me, però, non faccio più molto di questo - vedi blackbeltvb.com

Due altri modi in cui ho fatto questo è 1) per agganciare i messaggi di creazione di Windows, guarda per quella finestra pop-up , quindi fare qualcosa (SetWindowsHookEx) e 2) enumerare tutte le maniglie della finestra in uso, quindi cercare quella nuova.

8

Prova questo:

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