Geo Jackson Ответов: 2

Сворачивание окна консоли в системный трей


Как свернуть консольное приложение в системный трей и восстановить консоль при нажатии на значок в трее

2 Ответов

Рейтинг:
15

#realJSOP

Вы не можете свернуть окно консоли в системный трей. Это функция графического интерфейса, а консольное приложение не является графическим интерфейсом.

Вы можете создать приложение WinForms и имитировать внешний вид окна консоли, а затем свернуть его в системном трее.


Geo Jackson

Можно ли преобразовать консольное приложение в приложение Windows

#realJSOP

Вероятно, лучше всего начать с нуля с нового приложения WinForms и переместить код из консольного приложения в приложение WinForms вручную.

Geo Jackson

Я попробовал это сделать , но моя windows не отвечает, Когда она ждет принятия соединения.

Рейтинг:
1

Rak_i

Этот поток стар, но все еще думал, что кто-то может захотеть получить решение, не меняя свои типы проектов. И это решение специфично для C#, поэтому я думаю, что аналогичный подход может быть и для VC++. Не имеет практического опыта работы с VC++

Вы можете достичь этого, используя несколько простых шагов. Этот фрагмент кода сводит к минимуму окно консоли, скрывает от панели задач. Вы можете скрыть, восстановить приложение из панели уведомлений.



class Program
	{


		[DllImport("user32.dll", SetLastError = true)]
		static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

		[DllImport("user32.dll")]
		static extern IntPtr GetShellWindow();

		[DllImport("user32.dll")]
		static extern IntPtr GetDesktopWindow(); 
			

		static NotifyIcon notifyIcon;
		static IntPtr processHandle;
		static IntPtr WinShell;
		static IntPtr WinDesktop;
		static MenuItem HideMenu;
		static MenuItem RestoreMenu;

		static void Main(string[] args)
		{
			notifyIcon = new NotifyIcon();			
			notifyIcon.Icon = new Icon("TestICON.ico");
			notifyIcon.Text = "Monitor";			
			notifyIcon.Visible = true;

			ContextMenu menu = new ContextMenu();
			HideMenu = new MenuItem("Hide", new EventHandler(Minimize_Click));
			RestoreMenu = new MenuItem("Restore", new EventHandler(Maximize_Click));

			menu.MenuItems.Add(RestoreMenu);
			menu.MenuItems.Add(HideMenu);
			menu.MenuItems.Add(new MenuItem("Exit", new EventHandler(CleanExit)));

			notifyIcon.ContextMenu = menu;

                        //You need to spin off your actual work in a different thread so that the Notify Icon works correctly
			Task.Factory.StartNew(Run);

			processHandle = Process.GetCurrentProcess().MainWindowHandle;
			
			WinShell = GetShellWindow();

			WinDesktop = GetDesktopWindow();

                        //Hide the Window
			ResizeWindow(false);

                        ///This is required for triggering WinForms activity in Console app
			Application.Run();
						

		}

		static void Run()
		{
			Console.WriteLine("Listening to messages");

			while (true)
			{
				System.Threading.Thread.Sleep(1000);
			}
		}


		private static void CleanExit(object sender, EventArgs e)
		{
			notifyIcon.Visible = false;
			Application.Exit();
			Environment.Exit(1);
		}
		

		static void Minimize_Click(object sender, EventArgs e)
		{			
			ResizeWindow(false);
		}


		static void Maximize_Click(object sender, EventArgs e)
		{
			ResizeWindow();
		}

		static void ResizeWindow(bool Restore = true)
		{
			if (Restore)
			{
				RestoreMenu.Enabled = false;
				HideMenu.Enabled = true;				
				SetParent(processHandle, WinDesktop);
			}
			else
			{
				RestoreMenu.Enabled = true;
				HideMenu.Enabled = false;
				SetParent(processHandle, WinShell);
			}
		}
	}


claudiocas

Код отличный, но он не работает на Windows Server Standard...