2010-03-01 33 views
7

tôi đã tạo ra một cửa sổ tùy chỉnh lớp WPF với các thuộc tính sau:C# WPF - Biểu tượng ứng dụng + ShowInTaskbar = False

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. Background = Transparent
  4. Trên cùng = True
  5. Biểu tượng = "Icon.ico"

Tôi đã thêm Icon.ico trong "Project Properties" -> "Application" tab.

Biểu tượng hiển thị dưới dạng biểu tượng cửa sổ WPF mặc định nếu ShowInTaskBar là sai, nhưng hiển thị chính xác nếu ShowInTaskbar là đúng.

Chúng tôi muốn biểu tượng hiển thị chính xác trong menu Alt + Tab. Làm thế nào chúng ta có thể đạt được điều này và có ShowInTaskbar = False?

Trả lời

3

Có một số vấn đề ở đây. Trước hết, khi thuộc tính ShowInTaskbar được đặt thành false, một cửa sổ vô hình sẽ được tạo và gán làm cha của cửa sổ hiện tại. Biểu tượng cửa sổ vô hình này được hiển thị khi chuyển đổi giữa các cửa sổ.

Bạn có thể bắt cửa sổ với Interop và thiết lập biểu tượng của nó như thế này:

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

Những vấn đề khác để bạn có thể suy nghĩ về sẽ là:

  1. Tìm hiểu những gì sẽ xảy ra khi ShowInTaskbar thay đổi sở hữu trong thời gian chạy;
  2. Trích xuất biểu tượng từ cửa sổ của bạn thay vì từ tệp;
+0

Tôi sẽ thử điều này và cho bạn biết kết quả của mình. – jonathanpeppers

+0

Giải pháp của bạn hoạt động, nhưng cuối cùng GC thu thập Biểu tượng và nó ngừng hoạt động. (Lúc đầu, tôi nghĩ nó không hoạt động) Tôi phải cất giữ Icon trong một biến thành viên của cửa sổ và bỏ đi khi đóng cửa. Tôi đã thử nhiều cách khác nhau để lấy BitmapSource từ thuộc tính Icon của Window và lấy một HICON, nhưng không có may mắn. Là một ví dụ làm việc khác. – jonathanpeppers

Các vấn đề liên quan