Is there a way to change the console Icon at runtime

后端 未结 2 993
无人及你
无人及你 2020-12-20 22:05

i\'m not interested in changing the actual icon in the EXE that shows up in windows explorer, but just the icon that shows up in the top left of the console window. Already

相关标签:
2条回答
  • 2020-12-20 22:36

    Since the comment referred to in Josh's answer seems to have gone away, here is the C++ code to do it:

    HMODULE hKernel32 = ::LoadLibrary(_T("kernel32.dll"));
    typedef BOOL (_stdcall * SetConsoleIconFunc)(HICON);
    SetConsoleIconFunc setConsoleIcon
        = (SetConsoleIconFunc)::GetProcAddress(hKernel32, "SetConsoleIcon");
    if (setConsoleIcon != NULL)
        setConsoleIcon(m_hIcon);
    ::FreeLibrary(hKernel32);
    
    0 讨论(0)
  • 2020-12-20 22:38

    Following on Leniel's answer, I wanted to do this in a C# winforms app.. The link he posted to is C++.. Essentially here is the code you need if you want to do this in C#:

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetConsoleIcon(IntPtr hIcon);
    

    and call it like this:

    public static void SetConsoleIcon(System.Drawing.Icon icon)
            {
                SetConsoleIcon(icon.Handle);
            }
    

    I have a ConsoleWindow class I use in a winforms app that gives the the ability to show a console window aswell. Here is the full class def

     class ConsoleWindow
        {
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern bool AllocConsole();
    
            [DllImport("kernel32.dll")]
            static extern bool AttachConsole(int dwProcessId);
            private const int ATTACH_PARENT_PROCESS = -1;
    
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
    
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern bool SetWindowText(IntPtr hwnd, String lpString);
    
            [DllImport("user32.dll")]
            static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
    
            [DllImport("user32.dll")]
            static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern bool SetConsoleIcon(IntPtr hIcon);
    
            const int SW_HIDE = 0;
            const int SW_SHOW = 5;
    
            const int SC_CLOSE = 0xF060;
            const int MF_GRAYED = 1;
    
            public static void AttachConsoleWindow()
            {
                // redirect console output to parent process;
                // must be before any calls to Console.WriteLine()
                AttachConsole(ATTACH_PARENT_PROCESS);
            }
    
            public static void ShowConsoleWindow()
            {
                var handle = GetConsoleWindow();
    
                if (handle == IntPtr.Zero)
                {
                    AllocConsole();
                }
                else
                {
                    ShowWindow(handle, SW_SHOW);
                }
            }
    
            public static void HideConsoleWindow()
            {
                var handle = GetConsoleWindow();
    
                ShowWindow(handle, SW_HIDE);
            }
    
            public static void SetWindowText(string text)
            {
                var handle = GetConsoleWindow();
    
                SetWindowText(handle, text);
            }
    
            public static void DisableCloseButton()
            {
                var handle = GetConsoleWindow();
    
                var hmenu = GetSystemMenu(handle, false);
    
                EnableMenuItem(hmenu, SC_CLOSE, MF_GRAYED);
            }
    
            public static void SetConsoleIcon(System.Drawing.Icon icon)
            {
                SetConsoleIcon(icon.Handle);
            }
        }
    
    0 讨论(0)
提交回复
热议问题