2011-01-10 25 views
5

Ho creato questa classe e funziona perfettamente per rendere trasparente la mia applicazione WPF agli eventi del mouse.Come posso rendere invisibile una finestra agli eventi del mouse in 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 questo per rendere la mia domanda ignorare gli eventi del mouse, ma dopo eseguire il codice, voglio l'applicazione per tornare alla normalità e gestire di nuovo gli eventi del mouse. Come può farlo?

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

Qual è il codice per ripristinare l'applicazione?

risposta

7

Il seguente codice nel tuo classe esistente ottiene gli stili delle finestre esistenti (GetWindowLong), e aggiunge la bandiera WS_EX_TRANSPARENT stile di quegli stili delle finestre esistenti:

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

Quando si vuoi cambiare il comportamento normale, devi rimuovere il flag WS_EX_TRANSPARENT aggiunto dagli stili di finestra. Si esegue questa operazione eseguendo un'operazione AND bit per bit (contrariamente all'operazione OR eseguita su , aggiungere alla bandiera). Non è assolutamente necessario per ricordare lo stile esteso recuperato in precedenza, come suggerito da deltreme's answer, poiché tutto ciò che si vuole fare è deselezionare il flag WS_EX_TRANSPARENT.

Il codice dovrebbe essere simile a questa:

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

Grazie per tutte le risposte e per questo ma ...... Operatore '!' non può essere applicato all'operando di tipo "int" – Larsen187

+0

@ Larsen187: Scusa, errore mio. Ho aggiornato il codice. Dovrebbe funzionare ora. Hai bisogno di un '' ', piuttosto che un'! '- quelli sono troppo vicini l'uno all'altro sulla tastiera. –

+0

Ottimo questo lavoro perfetto !! Grazie! – Larsen187

1

Questo codice recupera la finestra stile corrente:

int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 

Questo codice imposta il flag WS_EX_TRANSPARENT sul extendedStyle:

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

Tutto quello che dovete fare è ricordare ciò che extendedStyle avete ottenuto da GetWindowLong(), e chiama ancora SetWindowLong() con quel valore originale.

+0

Ci dispiace, ma non capire, può ShowMe plese come. – Larsen187

+2

Nessun motivo per ricordare 'extendedStyle'. Puoi semplicemente recuperare il valore corrente e rimuovere il flag 'WS_EX_TRANSPARENT' da esso. Vedi la mia [risposta] (http://stackoverflow.com/questions/4647345/how-can-i-make-a-window-invisible-to-mouse-events-in-wpf/4647540#4647540) per maggiori dettagli. –

+0

@Cody Gray: d'accordo, questa è una soluzione più elegante. –

1

Hai provato a utilizzare questo invece? (Questa finestra è uguale)

this.IsHitTestVisible = false; 
+0

this.IsHitTestVisible = false; non funziona – Larsen187

+0

Non sono sicuro di cosa intendi non funziona. Se hai un pulsante nel modulo, non puoi fare clic su di esso. Impostalo su true e gli eventi del mouse ricominciano a funzionare. –

+0

Penso che quello che intende è che gli eventi del mouse che si verificano nel modulo (come un clic) vengono passati a qualsiasi cosa si trovi al di sotto di esso nell'ordine Z. Non vuole solo disabilitare i clic, vuole rendere la finestra "trasparente" a questi eventi come se non fosse lì. –

Problemi correlati