2010-03-01 64 views
7

我創建具有以下屬性的自定義分層WPF窗口:C#WPF - 應用程序圖標+ ShowInTaskbar =假

  1. AllowsTransparency =真
  2. ShowInTaskbar =假
  3. 背景=透明
  4. Topmost = True
  5. Icon =「Icon.ico」

我在「項目屬性」 - >「應用程序」選項卡下添加了Icon.ico。

如果ShowInTaskBar爲false,則該圖標顯示爲默認的WPF窗口圖標,但如果ShowInTaskbar爲true,則該圖標將正確顯示。

我們希望圖標在Alt + Tab菜單中正確顯示。我們如何實現這一點,並有ShowInTaskbar = False?

回答

3

這裏有幾個問題。首先,當ShowInTaskbar屬性設置爲false時,會創建一個不可見窗口並將其指定爲當前窗口的父窗口。在窗口之間切換時會顯示該不可見窗口的圖標。

你能趕上該窗口與互操作,並設置它的圖標是這樣的:

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

的其他問題,你想想會是:

  1. 瞭解發生了什麼時,ShowInTaskBar屬性變化在運行時;
  2. 從窗口中提取圖標而不是從文件中提取圖標;
+0

我會試試這個,讓你知道我的結果。 – jonathanpeppers 2010-03-03 03:23:58

+0

您的解決方案有效,但最終GC收集圖標並停止工作。 (起初我認爲它根本不起作用)我必須將Icon存儲在窗口的成員變量中,並在關閉時處理。我嘗試了各種方法從Window的Icon屬性中獲取BitmapSource並獲取HICON,但沒有運氣。否則就是一個工作示例。 – jonathanpeppers 2010-03-03 15:04:38