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

标签 c# .net wpf icons favicon

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

  1. AllowsTransparency = True
  2. ShowInTaskbar = 假
  3. 背景 = 透明
  4. 最顶层 = 正确
  5. Icon = "Icon.ico"

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

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

我们希望图标在 Alt+Tab 菜单中正确显示。我们怎样才能做到这一点并让 ShowInTaskbar = False?

最佳答案

这里有几个问题。首先,当 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. 从窗口而不是文件中提取图标;

关于C# WPF - 应用程序图标 + ShowInTaskbar = False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2358677/

相关文章:

c# - 如何使用MVVM以编程方式更改ComboBox SelectedValue

c# - WPF DataGrid header 文件大小排序

c# - 关于c#中的静态类

c# - 如何在 JsonConvert SerializeObject() 中包含原始 HTML?

c# - 如何使用 Ajax 将文件和表单数据一起发布到 MVC Controller ?

c# - 从另一个 WCF 服务调用 ASMX 或 WCF 服务

c# - 为什么在传递对象时使用 'ref' 关键字?

c# - 使用 .NET 创建 tar.gz

c# - 异步,执行简单但耗时的操作

c# - Expression<Func<..>>.Compile() 的实际类型是什么?