C # WPF - значок приложения + ShowInTaskbar = False - PullRequest
8 голосов
/ 01 марта 2010

Я создал настраиваемое многослойное окно WPF со следующими свойствами:

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. Фон = Прозрачный
  4. Topmost = True
  5. Icon = "Icon.ico"

Я добавил Icon.ico на вкладке «Свойства проекта» -> «Приложение».

Значок отображается как значок окна WPF по умолчанию, если ShowInTaskBar имеет значение false, но отображается правильно, если ShowInTaskbar имеет значение true.

Мы хотим, чтобы значок правильно отображался в меню Alt + Tab. Как мы можем достичь этого и иметь ShowInTaskbar = False?

1 Ответ

4 голосов
/ 02 марта 2010

Здесь есть несколько проблем. Прежде всего, когда свойство ShowInTaskbar имеет значение false, создается невидимое окно и назначается в качестве родителя текущего окна. Значок этого невидимого окна отображается при переключении между окнами.

Вы можете поймать это окно с помощью Interop и установить его значок следующим образом:

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. Извлечение значка из вашего окна, а не из файла;
...