Как скрыть консольное приложение в C#

Если вы увлекаетесь программированием, вам при определенных задачах иногда требуется скрывать консольное приложение и ход его работы от пользователя. К примеру данные способы я использую при обновлении приложений, а так же при проверке целостности файлов, я не думаю что эту информацию нужно видеть пользователю, либо просто открытое черное командное окно. Вот для таких целей и служит следующий код, который позволить запускать приложение в скрытом состоянии. Есть несколько вариантов это сделать, но лучше использовать для этой задачи winapi, вот им мы и воспользуемся.

namespace Consol
{
    class Program
    {
        const int SW_HIDE = 0;
        const int SW_SHOW = 5;
        const int SW_Min = 2;
        const int SW_Max = 3;
        const int SW_Norm = 4;
 
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();
 
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
        [STAThread]
        static void Main(string[] args)
        {
            var handle = GetConsoleWindow();
 
            //скрыть консоль
            ShowWindow(handle, SW_HIDE);
 
            //отобразить консоль
            ShowWindow(handle, SW_SHOW);

           //свернуть консоль
            ShowWindow(handle, SW_Min);

           //развернуть консоль
            ShowWindow(handle, SW_Max);
          
           //нормальный размер консоли
            ShowWindow(handle, SW_Norm);

        }
    }
}

В примере так же описывается возможность программно с помощью winapi сворачивать, разворачивать, скрывать, отображать и открывать консоль в нормальном состоянии.

Однако этот способ имеет недостатки, потому что консоль все таки появится на несколько миллисекунд и пользователь увидит ее.

Исправим и эту проблему. Для этого создадим новый проект WinForm

 

и зайдя в окно обозревателя просто удалим конструктор Form1.cs и в результате у нас должно быть так :

Теперь заходим в фаил Program.cs и за комментируем либо удаляем существующий внутри метода main код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp31
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //было так
            //Application.Run(new Form1());
        }
    }
}

И все наша работа происходит в этом классе Program, а работа ни чем не отличается от консольной программы. Да же если написать следующий пример:

  [STAThread]
        static void Main(string[] args)
        {

            //args = Environment.Is64BitOperatingSystem();
         //   Application.EnableVisualStyles();
         //   Application.SetCompatibleTextRenderingDefault(false);

            Thread.Sleep(10000);
            MessageBox.Show("nookery.ru");
         //   Application.Run(new Form1(args));

        }

Только спустя 10 секунд мы увидим сообщение.

 

 

 

Обновлено: 27.10.2018 — 12:29

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.