【问题标题】:C# WPF - Application Icon + ShowInTaskbar = FalseC# WPF - 应用程序图标 + ShowInTaskbar = False
【发布时间】:2010-03-01 20:04:05
【问题描述】:

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

  1. AllowsTransparency = True
  2. ShowInTaskbar = False
  3. 背景 = 透明
  4. 最上面 = 真
  5. 图标 = "图标.ico"

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

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

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

【问题讨论】:

    标签: c# .net wpf icons favicon


    【解决方案1】:

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

    【讨论】:

    • 我会试试这个,让你知道我的结果。
    • 您的解决方案有效,但最终 GC 收集了图标并停止工作。 (起初我认为它根本不起作用)我必须将 Icon 存储在窗口的成员变量中并在关闭时处理。我尝试了各种方法从 Window 的 Icon 属性中获取 BitmapSource 并获得一个 HICON,但没有运气。否则是一个工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2016-09-24
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多