C#控制台应用程序图标

29

有人知道如何在代码中设置C#控制台应用程序的图标吗?(而不是使用Visual Studio中的项目属性)

3个回答

31

您可以在项目属性中更改它。

请参阅此 Stack Overflow 文章:是否可以从 .net 更改控制台窗口的图标?

简而言之,在 Visual Studio 中右键单击您的项目(不是解决方案),选择属性。 在“应用程序”选项卡的底部,有一个“图标和清单”部分,您可以在那里更改图标。


10
我们会忽略掉 OP 明确表示他们想要一种在代码中实现的方式吗?而不是从项目属性中实现? - Kristopher
3
这提供了我正在寻找的解决方案。也许不是原帖所询问的。 - hanzolo

24

在代码中无法指定可执行文件的图标 - 它是二进制文件本身的一部分。

如果需要,你可以从命令行使用/win32icon:<file>,但无法在应用程序的代码中指定它。请记住,大多数时间运行应用程序时显示的是应用程序的图标,而不是你的应用程序正在运行!

这是假设你是指资源管理器中文件本身的图标。如果你是指应用程序正在运行时的图标(如果只需双击文件即可),我相信那将始终只是控制台本身的图标。


我不确定那对我是否可行。我正在使用CSharpCodeProvider编译一个C#应用程序中的控制台应用程序,我真的非常想为生成的二进制文件设置资源管理器图标... - pour toi
8
我找到了编译器选项: 编译器参数 cp = new CompilerParameters(); cp.CompilerOptions = "/optimize /target:winexe /win32icon:program.ico"; 谢谢! - pour toi
2
小小的侧记:似乎 VS 调试器偶尔会启动控制台程序,但没有正确地显示它们的图标。但这并不影响实际程序;可能只是因为它被包在调试器中或其他原因。 - Nyerguds

8

下面是一种通过代码更改图标的解决方案:

class IconChanger
{
    public static void SetConsoleIcon(string iconFilePath)
    {
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        {
            if (!string.IsNullOrEmpty(iconFilePath))
            {
                System.Drawing.Icon icon = new System.Drawing.Icon(iconFilePath);
                SetWindowIcon(icon);
            }
        }
    }
    public enum WinMessages : uint
    {
        /// <summary>
        /// An application sends the WM_SETICON message to associate a new large or small icon with a window. 
        /// The system displays the large icon in the ALT+TAB dialog box, and the small icon in the window caption. 
        /// </summary>
        SETICON = 0x0080,
    }

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


    private static void SetWindowIcon(System.Drawing.Icon icon)
    {
        IntPtr mwHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
        IntPtr result01 = SendMessage(mwHandle, (int)WinMessages.SETICON, 0, icon.Handle);
        IntPtr result02 = SendMessage(mwHandle, (int)WinMessages.SETICON, 1, icon.Handle);
    }// SetWindowIcon()
}

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