Jak přidat ikonu ke konzolové aplikaci (C#)

⚠️ Pozor: obrázky z tohoto příspěvku se ztratily při výpadku v roce 2016. Chybějící obrázky nahradí automaticky vtipným placeholderem plugin Broken Image Placeholder.

1)Přidejte do Vaší konzolové aplikace reference na tyto 4 Assembly: PresentationCore, System.Drawing, System.Xaml a WindowsBase.
Hledani assembly Presentation Core
Takhle se přidává assembly PresentationCore, stačí stisknout OK!
2)Do souboru(ů), kde budeme mít tyto třídy musíme mít tyto using directivy. Jedná se o ty co jsou v Program.cs po vytvoření konzolové aplikace a mnou přidané skrze Resolve:

CSHARP
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;

3)Vytvoříme si několik tříd. Jsou to výtažky z mých pomocných tříd, jsou tam ponechány pouze metody, které se v této ukázce používají:

CSHARP
class BitmapImageHelper
{
    public static BitmapImage MsAppx(string relPath)
    {
        BitmapImage bs = new BitmapImage(new Uri(ImageHelper.protocol + relPath, UriKind.Absolute));
        return bs;
    }
}
class ImageHelper
{
    public static string protocol = "pack://application:,,,";
    public static void SetAssemblyNameForWpfApps(string assemblyName)
    {
        protocol += "/" + assemblyName + ";component/";
    }
    public static void RegisterPackProtocol()
    {
        if (!UriParser.IsKnownScheme("pack"))
        new System.Windows.Application();
    }
}
class Pictures
{
    public static Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
    {
        // BitmapImage bitmapImage = new BitmapImage(new Uri("../Images/test.png", UriKind.Relative));
        using (MemoryStream outStream = new MemoryStream())
        {
            BitmapEncoder enc = new BmpBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(bitmapImage));
            enc.Save(outStream);
            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
            // return bitmap; <-- leads to problems, stream is closed/closing ...
            return new Bitmap(bitmap);
        }
    }
}
class W32
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetConsoleIcon(IntPtr hIcon);
}

4)Na konec napíšeme do Main() kód, který ikonku ke konzolové aplikaci přidá:

CSHARP
Console.Title = "Konzolova aplikace s logem MS";
//-tempConsoleWithoutSwf je jmenem assembly volajiciho kodu(pokud zdejsi pomocne tridy budou v jinem sestaveni)!
ImageHelper.SetAssemblyNameForWpfApps("tempConsoleWithoutSwf");
ImageHelper.RegisterPackProtocol();
BitmapImage bi = BitmapImageHelper.MsAppx("LogoMicrosoft.png");
Bitmap bmp = Pictures.BitmapImage2Bitmap(bi);
W32.SetConsoleIcon(bmp.GetHicon());
Console.WriteLine("Program dokoncil svou cinnost, kliknutim na enter jej ukoncite.");
Console.ReadLine();

5)Nyní už jen zbývá do rootu projektu přidat obrázkový soubor LogoMicrosoft.png, ideálně ve čtvercové velikosti(zde bylo 50x50) a nastavit mu Build action z Content na Resource. Výsledek vypadá pak nějak takto:
Konzolova aplikace s ikonkou

Leave a Reply

Your email address will not be published. Required fields are marked *