如何在C#中仅通过进程实例从可执行文件中获取图标?

29

我可以从进程中获取可执行文件的位置,如何从文件中获取图标?

也许可以使用Windows API LoadIcon()。我想知道是否有.NET的方法...


另请参阅,几乎是重复的:https://dev59.com/51DTa4cB1Zd3GeqPNvUM - Doc Brown
3个回答

43
Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);

3
Process.MainModule在系统进程或32位和64位进程之间可能会引发Win32Exception异常。有关详细信息,请参见此问题 - Nathan Goings
1
另外,我的图标没有透明度,导致出现难看的黑色轮廓 :/ - Nathan Goings

13

这是一个控制台应用程序实现的示例。

using System;
using System.Drawing;         //For Icon
using System.Reflection;      //For Assembly

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //Gets the icon associated with the currently executing assembly
                //(or pass a different file path and name for a different executable)
                Icon appIcon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);                
            }
            catch(ArgumentException ae) 
            {
                //handle
            }           
        }
    }
}

更正一下,那段代码只针对当前汇编...与此无关。哦,还有你漏了括号。 - TheSoftwareJedi
使用 Icon = Icon.ExtractAssociatedIcon(Process.GetCurrentProcess().MainModule.FileName); 代替反射当前程序集,会更快吗? - Igor Levicki

3
使用 ExtractIconEx (和 这里) 的 p/invoke。您可以从任何 dll 或 exe 中提取小型和大型图标。Shell32.dll 本身有超过 200 个图标,对于标准的 Windows 应用程序非常有用。您只需要首先确定您想要的图标的索引。

编辑:我进行了快速的 SO 搜索,并发现 这里。索引 0 图标是应用程序图标。


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