2010-03-01 14 views
7

He creado una ventana personalizada en capas WPF con las siguientes propiedades:C# WPF - Icono de la aplicación + ShowInTaskbar = False

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. Antecedentes = Transparente
  4. El órgano más importante = True
  5. Icono = "icon.ico"

He agregado Icon.ico en "Propiedades del proyecto" -> pestaña "Aplicación".

El ícono aparece como el ícono predeterminado de la ventana WPF si ShowInTaskBar es falso, pero se visualiza correctamente si ShowInTaskbar es verdadero.

Queremos que el icono se muestre correctamente en el menú Alt + Tab. ¿Cómo podemos lograr esto y tener ShowInTaskbar = False?

Respuesta

3

Aquí hay varios problemas. En primer lugar, cuando la propiedad ShowInTaskbar se establece en false, se crea una ventana invisible y se asigna como padre de la ventana actual. El icono de esta ventana invisible se muestra al cambiar de una ventana a otra.

Se puede tomar esa ventana con la interoperabilidad y la puso de icono como este:

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

Los otros problemas para los que piensen que sería:

  1. descubrir qué sucede cuando cambia la propiedad ShowInTaskBar en tiempo de ejecución;
  2. Extraiga un icono de su ventana en lugar de un archivo;
+0

Intentaré esto y le dejaré saber mis resultados. – jonathanpeppers

+0

Su solución funciona, pero finalmente el GC recoge el icono y deja de funcionar. (Al principio pensé que no funcionaba en absoluto). Tuve que guardar el icono en una variable miembro de la ventana y deshacerme de él cuando estaba cerrado. Intenté varias formas de tomar BitmapSource desde la propiedad Icono de la ventana y obtener un HICON, pero no tuve suerte. Es un ejemplo de trabajo de lo contrario. – jonathanpeppers

Cuestiones relacionadas