Есть ли способ изменить значок консоли во время выполнения - PullRequest
4 голосов
/ 07 июня 2010

Меня не интересует изменение действительного значка в EXE, который отображается в проводнике Windows, но только значок, который отображается в верхнем левом углу окна консоли. Я уже установил значок в проекте Visual Studio и получил его в проводнике Windows, а также этот значок появляется в окне консоли, я просто хочу иметь возможность изменить его в окнах консоли во время выполнения. Т.е. скажем, я хотел поставить значок, который показывает, что есть новые электронные письма или что-то в этом роде.

Ответы [ 2 ]

7 голосов
/ 04 июня 2014

Следуя ответу Лениэля, я хотел сделать это в приложении winforms C #. Ссылка, на которую он разместил ссылку, - C ++. По сути, вот код, который вам нужен, если вы хотите сделать это в C #:

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

и назовите это так:

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

У меня есть класс ConsoleWindow, который я использую в приложении winforms, которое дает возможность также показывать окно консоли.Вот полный класс 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);
        }
    }
1 голос
/ 18 августа 2017

Поскольку комментарий, упомянутый в ответе Джоша, кажется, ушел, вот код C ++ для этого:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...