如何在任务栏图标和标题栏显示的图标不同的情况下设置任务栏图标?(使用C#)

20

我有应用程序图标的深色和浅色版本; 在类似 Windows XP 任务栏的灰色表面上,深色版本效果最佳,而浅色版本最适合作为标题栏中的图标。

是否有一种方法可以将任务栏中的图标设置为与 C#中我的窗体使用的图标不同的图标(P / Invoke 可行)?


1
它们是两个独立的项目还是一个项目,您想以编程方式设置它吗? - Ranhiru Jude Cooray
1
这是同一个项目(同一个表单),我想以编程方式设置它。 - Hach-Que
我在 .Net 4.0 中读到了关于 "Window.TaskbarItemInfo" 的内容。可能可以通过覆盖属性来实现。 - Sauleil
我会选择一个在浅色和深色主题下都好看的更好的图标。因为你无法保证用户的颜色偏好。你怎么知道用户是否正在使用原始XP主题? - banging
你是如何解决这个问题的? - user1705996
2个回答

15

使用不同的图标句柄将WM_SETICON消息发送到您的窗体,其中ICON_SMALL和ICON_BIG参数使用不同的图标句柄:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam);

private const uint WM_SETICON = 0x80u;
private const int ICON_SMALL = 0;
private const int ICON_BIG = 1;

public MyForm()
{
    InitializeComponent();

    SendMessage(this.Handle, WM_SETICON, ICON_SMALL, Properties.Resources.IconSmall.Handle);
    SendMessage(this.Handle, WM_SETICON, ICON_BIG, Properties.Resources.IconBig.Handle);
}

好的回答!肯定要+1! - MaxOvrdrv
2
你能给我更多的信息吗?我不知道如何应用这个解决方案。 - user1705996

8

我知道这是一个旧问题,但当我试图实现同样的事情时,我遇到了它,好吧,至少在Windows 7/8上你可以做到这一点。

原来ICO文件不仅包含一个图像,而是包含9个不同分辨率的图像:

  • 16x16
  • 24x24
  • 32x32
  • 48x48
  • 64x64
  • 72x72
  • 80x80
  • 96x96
  • 128x128

在Windows 7和8上,任务栏使用64x64图像,而位于窗体左上角的图标使用16x16图像。

您可以使用类似Greenfish Icon Editor Pro(我不为他们工作或做任何事情,这不是广告!)的工具将其作为两个单独的图像,并像往常一样将此*.ico文件添加到Visual Studio的Windows Form / WPF表单中。

最终结果如下所示:

WPF

正如您所看到的,我的WPF应用程序有两个独立的图标,一个在任务栏上,另一个在窗体上。


1
.ico文件中可能有任意数量的图标。此解决方案可能有效,但实际上并不实用。另外:Windows不一定使用64x64图标来显示任务栏图标。在默认dpi设置的典型系统上,32x32图标可以工作。对于更高的dpi比例,Windows将为标题栏和任务栏使用不同的图标大小。 - Andreas Adler
如果在将图标设置为窗体图标之前修改了它(例如,使用比默认调整程序更好的质量将32x32图标调整为16x16),则可能会丢失原始图标文件中包含的所有其他大小。 @AndreasAdler的答案绝对是针对所提出问题的最佳答案。 - MaxOvrdrv
1
另外,如果您勾选了“任务栏->使用小任务栏按钮”设置,Windows也会使用16x16的图标。 - Gustaf Carleson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接