2010-03-08 6 views
14

Sto provando a creare un'applicazione simile a "gadget" usando WPF. L'obiettivo è quello di ottenere lo stesso comportamento come un normale Windows 7 gadget:Il gadget di Windows in WPF - mostra mentre "Mostra desktop" è attivato

  • No entry task-bar
  • non si presenta quando si ALT + TAB finestre
  • non sempre in primo piano, le applicazioni possono essere in cima
  • visibile durante l'esecuzione di 'Aero Peek'
  • visibile durante l'utilizzo di 'Mostra desktop'/Windows + D

sono stato in grado di realizzare i primi quattro goa Sì, ma non sono riuscito a trovare una soluzione al quinto problema. Il più vicino possibile è quello di utilizzare la classe di utilità da How do you do AppBar docking (to screen edge, like WinAmp) in WPF?, ma ciò trasforma l'app in una "barra degli strumenti", eliminando in tal modo le applicazioni dalla parte dello schermo in cui è posizionata la GUI del mio gadget.

Posso vedere che domande simili sono state precedentemente poste su Stackoverflow, ma quelle si sono estinte prima che fosse trovata una soluzione. Distacco in ogni caso, nella speranza che v'è ora qualcuno là fuori con la conoscenza per risolvere questo =)

risposta

1

provare a impostare Topmost al vero, e quando l'applicazione perde lo stato attivo è possibile impostare l'opacità a 0.

ho fatto questo xaml:

<Window x:Class="OpacTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Topmost="True" Background="Transparent" ShowInTaskbar="False" AllowsTransparency="True" WindowStyle="None" Width="400" Height="300"> 
    <Grid> 
     <Border Background="Black" CornerRadius="5" /> 
    </Grid> 
</Window> 

ho fatto questo in C# per la finestra:

protected override void OnActivated(EventArgs e) 
{ 
    base.OnActivated(e); 

    Opacity = 1; 
} 

protected override void OnDeactivated(EventArgs e) 
{ 
    base.OnDeactivated(e); 

    Opacity = 0; 
} 

in questo modo si ottiene un pezzo di strada lì; hai bisogno di un modo per sapere se il desktop si concentra.

Scommetto che è possibile farlo collegandosi all'evento WndProc della finestra del desktop e cercando WM_ACTIVATE.

Si potrebbe:

  • chiamata GetDesktopWindow per ottenere l'handle della finestra del desktop
  • Usa ap/invocare chiamata per impostare la richiamata per il WndProc
  • maniglia WM_ACTIVATE o il messaggio di Windows appropriata e impostare la tua Opacità torna a 1
+0

Questo funziona effettivamente. – Larry

1

È possibile implementare un vero Gadget di Windows utilizzando WPF creando un XBAP. Basta aggiungere un file gadget.xml e un file .html che contiene solo un IFRAME che carica XBAP. In questo modo la tua applicazione WPF sarà effettivamente un gadget e seguirà automaticamente tutte le regole.

Un'altra opzione è utilizzare Windows Sidebar Styler. Ciò richiede l'installazione di software aggiuntivo accanto al tuo ma consente anche di eseguire operazioni che non è possibile eseguire all'interno della sandbox XBAP senza certificati di firma del codice, autorizzazione utente, ecc.

Una terza opzione è creare un gadget che utilizza qualcosa riconoscibile nell'HTML (come un particolare colore di sfondo), quindi all'avvio del file .exe, cerca un hWnd sotto Explorer con gli attributi che stai cercando, immettiti nel processo Explorer.exe e imposta la finestra come un figlio di esso.

Una variante della terza opzione è non iniettare in Explorer.exe, ma piuttosto mantenere l'indice Z e la posizione (utilizzando SetWindowPos) per tenere traccia dell'indice Z e della posizione della hWnd trovata.

Tante scelte ...

0

Una soluzione per fare ottenere il "gadget" come comportamento, è quello di rendere la vostra finestra un bambino del desktop. In questo modo, la tua finestra è sempre visibile sul desktop anche se premi Windows + D. Puoi vedere come è fatto qui: Window "on desktop".

Problemi correlati