2009-04-15 25 views
11

¿Hay alguna manera de poner una aplicación de consola en la bandeja del sistema cuando se minimiza?. Consola .Net Aplicación en la bandeja del sistema

utilizo Net 3.5 con C#

+2

No, no es un idiota. ¡Esto habla de una aplicación de consola, no de una aplicación de winform! – Sascha

+0

En realidad, tomo la sugerencia de engaño. Esta es una pregunta acerca de una aplicación de consola no winforms – JaredPar

+0

Hola, Yo también quiero la solución para arriba ... He intentado la sugerencia de "CLaRGe" hasta la función FindWindow ... pero no pude seguir adelante ya que MSDN carece de ejemplos específicos en "... la consola está en pantalla, capture el botón minimizar y haga clic para usarla para ocultar la ventana de la consola y actualizar el icono Notificar ..." ¿Alguien podría sugerir con código cómo capturar el botón minimizar de la consola? Haga clic y oculte la ventana de la consola y actualizar el icono de notificación. Cualquier sugerencia sería muy apreciada. –

Respuesta

8

Una consola no tiene ventana para minimizar por sí mismo. Se ejecuta en una ventana de símbolo del sistema. Puede conectar los mensajes de la ventana y ocultar la ventana al minimizar. En su aplicación, es posible agregar un icono de bandeja del mismo modo que lo haría en una aplicación de Windows. Bueno, de alguna manera esto huele a ...

Pero: no estoy seguro de por qué quieres hacer esto. Una aplicación de consola es, por diseño, diferente a una aplicación de Windows. Por lo tanto, ¿tal vez sea una opción cambiar la aplicación para que sea una aplicación de formulario de Windows?

0

No puede ocultar una aplicación de consola porque en realidad no tiene una ventana para ocultar, ya que se ejecuta en la consola (la consola en sí es solo una ventana de la consola, no la aplicación que se ejecuta en ella)

20

Sí, puedes hacer esto. Cree una aplicación de Windows Forms y agregue un NotifyIcon component.

A continuación, utilice los siguientes métodos (found on MSDN) para asignar y mostrar una consola

[DllImport("kernel32.dll")] 
public static extern Boolean AllocConsole(); 

[DllImport("kernel32.dll")] 
public static extern Boolean FreeConsole(); 

[DllImport("kernel32.dll")] 
public static extern Boolean AttachConsole(Int32 ProcessId); 

Cuando la consola está en pantalla, capturar el botón de minimizar clic y lo utilizan para ocultar la ventana de la consola y actualizar el icono de notificación. Puede encontrar su ventana usando los siguientes métodos (found on MSDN):

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
// Also consider whether you're being lazy or not. 
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

asegúrese de llamar FreeConsole cuando esté listo para cerrar la aplicación.

1
[DllImport("user32.dll")] 
internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam); 
static Int32 WM_SYSCOMMAND = 0x0112; 
static Int32 SC_MINIMIZE = 0x0F020; 

static void Main(string[] args) 
{ 
    SendMessage(Process.GetCurrentProcess().MainWindowHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0); 
} 
+2

Este código solo minimiza la consola. –

2

Yo uso TrayRunner para exactamente este propósito. Esencialmente, envuelve una aplicación de consola que captura todos los resultados. Pero cuando se minimiza, se minimiza a la bandeja del sistema en lugar de a la barra de tareas. Incluso puedes personalizar qué icono mostrar cuando se minimiza. Lo uso para cosas como Tomcat o Apache para liberar espacio en mi barra de tareas sin ejecutarlos como servicios de Windows.

+0

Windows 10 informó TrayRunner como Malware ... – mafrosis

+1

Windows 10 es Malware. :-) En cuanto a TrayRunner, creo que es viejo y no se ajusta a un nuevo requisito de Microsoft. Ciertamente no es un malware. –

+0

Forma más rápida de hacer el trabajo. Bastante barebone herramienta sin embargo. –

2
using System.Windows.Forms; 
using System.Drawing; 

static NotifyIcon notifyIcon = new NotifyIcon(); 
static bool Visible = true; 
static void Main(string[] args) 
{ 
    notifyIcon.DoubleClick += (s, e) => 
    { 
     Visible = !Visible; 
     SetConsoleWindowVisibility(Visible); 
    }; 
    notifyIcon.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
    notifyIcon.Visible = true; 
    notifyIcon.Text = Application.ProductName; 

    var contextMenu = new ContextMenuStrip(); 
    contextMenu.Items.Add("Exit", null, (s, e) => { Application.Exit(); }); 
    notifyIcon.ContextMenuStrip = contextMenu; 

    Console.WriteLine("Running!"); 

    // Standard message loop to catch click-events on notify icon 
    // Code after this method will be running only after Application.Exit() 
    Application.Run(); 

    notifyIcon.Visible = false; 
} 

[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
public static void SetConsoleWindowVisibility(bool visible) 
{ 
    IntPtr hWnd = FindWindow(null, Console.Title); 
    if (hWnd != IntPtr.Zero) 
    { 
     if (visible) ShowWindow(hWnd, 1); //1 = SW_SHOWNORMAL   
     else ShowWindow(hWnd, 0); //0 = SW_HIDE    
    } 
} 
Cuestiones relacionadas