2009-04-15 18 views
11

C'è un modo per inserire un'applicazione console nella barra delle applicazioni quando si minimizza?. Applicazione console console nel vassoio di sistema

Io uso Net 3.5 con C#

+2

No, non un dupe. Questo parla di un'applicazione console, non di un'applicazione winform! – Sascha

+0

In realtà, riprendo il suggerimento. Questa è una domanda su un'applicazione di console non winform – JaredPar

+0

Hello, Anch'io voglio la soluzione per sopra ... ho provato il suggerimento "CLaRGe" fino alla funzione FindWindow ... ma non potrei andare oltre visto che MSDN manca di esempi specifici su "... la console è sullo schermo, cattura il pulsante minimizza clic e lo usa per nascondere la finestra della console e aggiorna l'icona di notifica .." Qualcuno potrebbe suggerire con il codice su come acquisire la console riduci a icona il pulsante e nascondi il finestra della console e aggiornare l'icona di notifica. Ogni suggerimento sarà molto apprezzato. –

risposta

8

Una console non ha una finestra per ridurre al minimo da solo. Funziona in una finestra del prompt dei comandi. Potresti agganciare i messaggi della finestra e nascondere la finestra su Riduci a icona. Nella tua applicazione è possibile aggiungere un'icona nel vassoio proprio come faresti in un'applicazione Windows. Bene, in qualche modo questo odori ...

Ma: non sono sicuro del perché tu voglia farlo. Un'applicazione console è di progettazione diversa da un'applicazione Windows. Quindi, forse è un'opzione per cambiare l'applicazione per essere un'applicazione di Windows form?

0

Non è possibile nascondere un'applicazione console perché in realtà non ha una finestra da nascondere, visto come viene eseguita nella console (la console stessa è solo una finestra della console, non l'applicazione in esecuzione)

20

Sì, è possibile farlo. Creare un'applicazione Windows Form e aggiungere un NotifyIcon component.

quindi utilizzare i seguenti metodi (found on MSDN) per allocare e visualizzare una console

[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); 

Quando la console è sullo schermo, catturare il pulsante minimizzare clic e lo usano per nascondere la finestra della console e aggiornare l'icona di notifica. Potete trovare la vostra finestra utilizzando i seguenti metodi (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); 

Assicurarsi di chiamare FreeConsole ogni volta che si è pronti a chiudere l'applicazione.

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

Questo codice riduce solo la console. –

2

Io uso TrayRunner esattamente per questo scopo. Essenzialmente, avvolge un'applicazione console catturando tutto l'output. Ma quando ridotto a icona, riduce al minimo la barra delle applicazioni invece della barra delle applicazioni. Puoi perfino personalizzare l'icona da mostrare quando ridotta a icona. Lo uso per cose come Tomcat o Apache per liberare spazio sulla mia barra delle applicazioni senza eseguirli come Windows Services.

+0

Windows 10 ha segnalato TrayRunner come malware ... – mafrosis

+1

Windows 10 è malware. :-) Per quanto riguarda TrayRunner, penso che sia solo vecchio e non conforme ai nuovi requisiti di Microsoft. Certamente non è un malware. –

+0

Il modo più veloce per portare a termine il lavoro. Strumento per le bare nude. –

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    
    } 
} 
Problemi correlati