2011-10-18 13 views
5

Necesito aplicar un desenfoque de fondo Aero a solo una parte de una ventana WPF con forma personalizada. El problema es que para aplicar el desenfoque con DWM, necesito proporcionar un identificador de ventana para la función DwmEnableBlurBehindWindow.¿Es posible obtener el Hwnd de un control emergente WPF?

Me han dicho que el control emergente de WPF es en realidad una ventana separada. Eso es bueno. ¿Puedo obtener un control emergente para aplicar desenfoque a él? ¿Si es así, cómo?

Respuesta

8

probar este

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

o esto, pero ésta sólo funciona para Windows real, pero podría ayudar para futuras referencias.

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

debe pasar '' myPopup.Child' a HwndSource.FromVisual() 'como en la respuesta de Cleber. De lo contrario, obtienes el padre de HwndSource of Popup (que es tu ventana principal, donde se declaró Popup en XAML). Pero si pasa 'myPopup.Child' obtendrá una ventana creada por Popup. – nevermind

0

¿Tiene un nombre de clase personalizado? Si es así, puede encontrar el identificador de ventana a través del nombre de clase (FindWindow).

Soy un poco hacker en lo que respecta a estas cosas en Windows, así que eso es lo que suelo probar primero, en lugar de tratar de descubrir un método "adecuado". Todo lo viejo para mí, ya no hago mucho más de esto - vea blackbeltvb.com

Dos otras formas en que he hecho esto es 1) para enganchar los mensajes de creación de ventanas, mire para esa ventana emergente , luego hazle algo (SetWindowsHookEx) y 2) enumera todos los identificadores de ventanas que se están usando, luego observa el nuevo.

8

Prueba esto:

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