C# C-WPF-添加图标后的项目大小(从资源中加载图标或从项目EXE中提取)

C# C-WPF-添加图标后的项目大小(从资源中加载图标或从项目EXE中提取),c#,.net,wpf,icons,C#,.net,Wpf,Icons,编辑1:编辑标题 编辑2:添加了方法3 编辑3:添加了方法4 我正在创建一个非常小的应用程序/实用程序,总共只有20KB。我的图标文件包含各种大小,大小为40KB 我添加图标的方式是,在解决方案资源管理器中右键单击我的项目,然后单击现有项…,然后我将再次右键单击我的项目,转到属性->应用程序,并在图标和清单下为整个项目选择我的新图标 执行此操作将在所有窗体、exe、任务栏等中显示我的图标…系统托盘图标除外 我加载系统托盘图标的方式是从EXE中提取图标: 方法1: 现在,我加载的所有图标的总项目大

编辑1:编辑标题

编辑2:添加了方法3

编辑3:添加了方法4

我正在创建一个非常小的应用程序/实用程序,总共只有20KB。我的图标文件包含各种大小,大小为40KB

我添加图标的方式是,在解决方案资源管理器中右键单击我的项目,然后单击现有项…,然后我将再次右键单击我的项目,转到属性->应用程序,并在图标和清单下为整个项目选择我的新图标

执行此操作将在所有窗体、exe、任务栏等中显示我的图标…系统托盘图标除外

我加载系统托盘图标的方式是从EXE中提取图标:

方法1:

现在,我加载的所有图标的总项目大小是20KB+40KB=60KB属性->应用程序,我会在那里选择项目图标。这会将我的图标大小加载两倍,使我的项目从20KB+40KB的图标跳到100KB

目前,我正在使用方法1。我想知道是否有更好的方法来加载我的图标并保持我的应用程序大小较小,而不是添加两次图标大小

虽然我确实理解60KB和100KB之间的差异并不是什么大不了的,但我只是想大致了解一下,以备将来参考。另外,想知道我的第一种方法是否有任何警告


我来自web开发背景,对C和WPF非常陌生。

这两种方法都可以很好地工作。对于这样简单的事情,没有正确的方法,只要代码能够完成任务,就没有人会抱怨


当使用WPF时,可执行文件的大小会很快变大,我正在处理一个数十兆字节的WPF.exe。

您在项目属性中添加的图标将添加到可执行文件的resources.rsrc部分,标识符为32512 IDI_应用程序。如果您不喜欢依赖Icon.ExtractAssociatedIcon,您可以使用一种更直接的方法来提取它-使用LoadIcon函数。但它没有包装在.NET中,因此还有更多代码:

IntPtr hIcon = LoadIcon(GetModuleHandle(null), new IntPtr(32512));
notifyIcon.Icon = Icon.FromHandle(hIcon);

[DllImport("user32.dll")]
static extern IntPtr LoadIcon (IntPtr hInstance, IntPtr iconName);
[DllImport("kernel32.dll")]
static extern IntPtr GetModuleHandle (string moduleName);
有关更多详细信息,请参阅问题

WPF包括在HICON和ImageSource之间来回转换图标的方法,因此,例如,如果您想在表单上显示图标,也可以查看Imaging.CreateBitmapSourceFromHIcon等

如果Icon.ExtractAssociatedIcon工作正常,我看没有理由为此烦恼。虽然可能存在一些问题,但此功能可能无法提取所有图标,而只能提取特定大小的图标


另请参见问题。

非常感谢您提供的示例和链接。这无疑帮助了我,并增加了更多实现我需要的方法。我知道你的意思,不过可能有一些问题。从EXE中拖动图标只会获取系统托盘32x32中的图标,并将其缩小到16x16,这看起来不如只抓取16x16版本的图标。但我仍在努力寻找一种方法。@hyperexpert Try。
notifyIcon.Icon = PROJECTNAME.Properties.Resources.icon;
IntPtr hIcon = LoadIcon(GetModuleHandle(null), new IntPtr(32512));
notifyIcon.Icon = Icon.FromHandle(hIcon);

[DllImport("user32.dll")]
static extern IntPtr LoadIcon (IntPtr hInstance, IntPtr iconName);
[DllImport("kernel32.dll")]
static extern IntPtr GetModuleHandle (string moduleName);
notifyIcon.Icon = new System.Drawing.Icon(Properties.Resources.ico, System.Windows.Forms.SystemInformation.SmallIconSize);
notifyIcon.Icon = new System.Drawing.ico;
IntPtr hIcon = LoadIcon(GetModuleHandle(null), new IntPtr(32512));
notifyIcon.Icon = Icon.FromHandle(hIcon);

[DllImport("user32.dll")]
static extern IntPtr LoadIcon (IntPtr hInstance, IntPtr iconName);
[DllImport("kernel32.dll")]
static extern IntPtr GetModuleHandle (string moduleName);