2010-03-01 11 views
7

J'ai créé une fenêtre WPF couche personnalisée avec les propriétés suivantes:C# WPF - Icône d'application + ShowInTaskbar = False

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. fond = Transparent
  4. Topmost = True
  5. Icône = "Icone.ICO"

J'ai ajouté Icon.ico sous "Propriétés du projet" -> onglet "Application".

L'icône affiche comme l'icône de la fenêtre par défaut WPF si ShowInTaskBar est faux, mais affiche correctement si ShowInTaskbar est vrai.

Nous voulons l'icône pour afficher correctement dans le menu Alt + Tab. Comment pouvons-nous y parvenir et avoir ShowInTaskbar = False?

Répondre

3

Il y a plusieurs problèmes ici. Tout d'abord, lorsque la propriété ShowInTaskbar est définie sur false, une fenêtre invisible est créée et affectée en tant que parent de la fenêtre en cours. L'icône de cette fenêtre invisible s'affiche lorsque vous passez d'une fenêtre à l'autre.

Vous pouvez attraper cette fenêtre avec Interop et définir son icône comme ceci:

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

Les autres problèmes pour vous de penser à serait:

  1. Découvrez ce qui se passe lorsque les changements de propriété ShowInTaskBar lors de l'exécution;
  2. Extrait une icône dans la fenêtre plutôt que de fichier;
+0

Je vais essayer et vous faire connaître mes résultats. – jonathanpeppers

+0

Votre solution fonctionne, mais finalement le GC recueille l'icône et il cesse de fonctionner. (Au début, je pensais que ça ne fonctionnait pas du tout) J'ai dû stocker l'icône dans une variable membre de la fenêtre et disposer lorsqu'il est fermé. J'ai essayé plusieurs façons de prendre le BitmapSource de la propriété Icon de la fenêtre et obtenir un HICON, mais pas de chance. Est un exemple de travail autrement. – jonathanpeppers