C#WPF - 应用程序图标+ ShowInTaskbar = False

jon*_*ers 8 .net c# favicon wpf icons

我创建了一个具有以下属性的自定义分层WPF窗口:

  1. allowsTransparency = True
  2. ShowInTaskbar = False
  3. 背景=透明
  4. 最顶层=真
  5. Icon ="Icon.ico"

我在"项目属性" - >"应用程序"选项卡下添加了Icon.ico.

如果ShowInTaskBar为false,则图标显示为默认WPF窗口图标,但如果ShowInTaskbar为true,则显示正确.

我们希望图标能够在Alt + Tab菜单中正确显示.我们如何实现这一点并使ShowInTaskbar = False?

Sta*_*zev 4

这里有几个问题。首先,当 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);
Run Code Online (Sandbox Code Playgroud)

您需要考虑的其他问题是:

  1. 了解 ShowInTaskbar 属性在运行时更改时会发生什么;
  2. 从窗口而不是文件中提取图标;

  • 您的解决方案有效,但最终 GC 收集了图标并且它停止工作。(起初我认为它根本不起作用)我必须将图标存储在窗口的成员变量中并在关闭时进行处理。我尝试了各种方法从窗口的 Icon 属性中获取 BitmapSource 并获得 HICON,但没有成功。否则是一个工作示例。 (2认同)