2010-03-01 18 views
7

Ho creato un finestra a più livelli personalizzato WPF con le seguenti proprietà:C# WPF - Icona di applicazione + ShowInTaskbar = False

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. Sfondo = trasparente
  4. Topmost = true
  5. Icon = "Icon.ico"

Ho aggiunto Icon.ico in "Proprietà progetto" -> scheda "Applicazione".

L'icona viene visualizzata come l'icona della finestra WPF predefinita se ShowInTaskBar è false, ma viene visualizzata correttamente se ShowInTaskbar è true.

Vogliamo che l'icona si visualizzi correttamente nel menu Alt + Tab. Come possiamo ottenere questo e avere ShowInTaskbar = False?

risposta

3

Ci sono diversi problemi qui. Innanzitutto, quando la proprietà ShowInTaskbar è impostata su false, viene creata una finestra invisibile che viene assegnata come parent della finestra corrente. L'icona di questa finestra invisibile viene visualizzata quando si passa da una finestra all'altra.

Si può prendere quella finestra con Interop e impostarlo di un'icona come questa:

private void Window_Loaded(object sender, RoutedEventArgs e) { 
    SetParentIcon(); 
} 

private void SetParentIcon() { 
    WindowInteropHelper ih = new WindowInteropHelper(this); 
    if(this.Owner == null && ih.Owner != IntPtr.Zero) { //We've found the invisible window 
     System.Drawing.Icon icon = new System.Drawing.Icon("ApplicationIcon.ico"); 
     SendMessage(ih.Owner, 0x80 /*WM_SETICON*/, (IntPtr)1 /*ICON_LARGE*/, icon.Handle); //Change invisible window's icon 
    } 
} 

[DllImport("user32.dll")] 
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

Gli altri problemi per voi di pensare sarebbe:

  1. scoprire cosa succede quando cambia proprietà ShowInTaskBar in fase di esecuzione;
  2. Estrarre un'icona dalla finestra anziché dal file;
+0

Proverò questo e ti farò sapere i miei risultati. – jonathanpeppers

+0

La soluzione funziona, ma alla fine il GC raccoglie l'icona e smette di funzionare. (All'inizio pensavo che non funzionasse affatto) ho dovuto memorizzare l'icona in una variabile membro della finestra e disporre quando chiuso. Ho provato vari modi per prendere BitmapSource dalla proprietà Window's Icon e ottenere un HICON, ma senza fortuna. È un esempio funzionante altrimenti – jonathanpeppers