Если вы увлекаетесь программированием, вам при определенных задачах иногда требуется скрывать консольное приложение и ход его работы от пользователя. К примеру данные способы я использую при обновлении приложений, а так же при проверке целостности файлов, я не думаю что эту информацию нужно видеть пользователю, либо просто открытое черное командное окно. Вот для таких целей и служит следующий код, который позволить запускать приложение в скрытом состоянии. Есть несколько вариантов это сделать, но лучше использовать для этой задачи winapi, вот им мы и воспользуемся.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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 код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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, а работа ни чем не отличается от консольной программы. Да же если написать следующий пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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 секунд мы увидим сообщение.