2011-01-10 11 views
5

Creé esta clase, y funciona perfectamente para hacer que mi aplicación WPF sea transparente a los eventos del mouse.¿Cómo puedo hacer que una ventana sea invisible para los eventos del mouse en WPF?

using System.Runtime.InteropServices; 

class Win32 

{ 
    public const int WS_EX_TRANSPARENT = 0x00000020; 
    public const int GWL_EXSTYLE = (-20); 

    [DllImport("user32.dll")] 
    public static extern int GetWindowLong(IntPtr hwnd, int index); 

    [DllImport("user32.dll")] 
    public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); 

    public static void makeTransparent(IntPtr hwnd) 
    { 
     // Change the extended window style to include WS_EX_TRANSPARENT 
     int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 
     Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);  
    } 

    public static void makeNormal(IntPtr hwnd) 
    { 
     //how back to normal what is the code ? 

    } 

} 

corro esto para hacer mi solicitud ignorar eventos de ratón, pero después de ejecutar el código, quiero que la aplicación vuelva a la normalidad y manejar los eventos del ratón de nuevo. ¿Cómo puede hacer eso?

IntPtr hwnd = new WindowInteropHelper(this).Handle; 
Win32.makeTransparent(hwnd); 

¿Cuál es el código para hacer que la aplicación vuelva a la normalidad?

Respuesta

7

El siguiente código en su clase existente obtiene los estilos de ventana existentes (GetWindowLong), y añade la bandera WS_EX_TRANSPARENT estilo a los estilos de ventana existentes:

// Change the extended window style to include WS_EX_TRANSPARENT 
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 
Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT); 

Cuando desea volver a cambiarlo al comportamiento normal, necesita eliminar el indicador WS_EX_TRANSPARENT que ha agregado desde los estilos de ventana. Para ello, realice una operación Y NO bit a bit (en contraste con la operación OR que realizó en , agregue el indicador). No hay absolutamente ninguna necesidad de recordar el estilo extendido previamente recuperado, como lo sugiere deltreme's answer, ya que todo lo que desea hacer es borrar el indicador WS_EX_TRANSPARENT.

El código sería algo como esto:

public static void makeNormal(IntPtr hwnd) 
{ 
    //Remove the WS_EX_TRANSPARENT flag from the extended window style 
    int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 
    Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle & ~WS_EX_TRANSPARENT); 
} 
+0

Gracias por todas las respuestas y por esto, pero ...... Operador '!' no se puede aplicar al operando de tipo 'int' – Larsen187

+0

@ Larsen187: Lo siento, mi error. He actualizado el código. Debería funcionar ahora. Necesita un '~', en lugar de '!', Esos están demasiado cerca el uno del otro en el teclado. –

+0

Genial este trabajo perfecto !! ¡Gracias! – Larsen187

1

Este código obtiene el estilo de ventana actual:

int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 

Este código establece el indicador WS_EX_TRANSPARENT en el extendedStyle:

Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT); 

Todo lo que necesita hacer es recordar lo que extendedStyle que obtuvo de GetWindowLong(), y llame de nuevo al SetWindowLong() con ese valor original.

+0

Lo sentimos, pero no entender, puede SHOWME Plese cómo. – Larsen187

+2

No hay razón para recordar el 'extendedStyle'. Puede recuperar el valor actual y eliminar el indicador 'WS_EX_TRANSPARENT' de él. Ver mi [respuesta] (http://stackoverflow.com/questions/4647345/how-can-i-make-a-window-invisible-to-mouse-events-in-wpf/4647540#4647540) para más detalles. –

+0

@Cody Gray: De acuerdo, esa es una solución más elegante. –

1

¿Ha intentado usar esto en su lugar? (Esto es igual a la ventana)

this.IsHitTestVisible = false; 
+0

this.IsHitTestVisible = false; no trabajo – Larsen187

+0

No estoy seguro de lo que quiere decir que no funciona. Si tiene un botón en el formulario, no puede hacer clic en él. Establézcalo en verdadero y los eventos del mouse vuelven a funcionar. –

+0

Creo que lo que quiere decir es que los eventos del mouse que ocurren en el formulario (como un clic) se pasan a lo que está debajo de él en el orden Z. No solo quiere desactivar los clics, quiere que la ventana sea "transparente" para estos eventos como si no estuviera allí. –

Cuestiones relacionadas