2009-10-24 14 views
9

Intendo quando l'utente avvia la mia applicazione (exe). Voglio che si avvii direttamente nella barra delle applicazioni, senza mostrare la finestra. Come i software antivirus & gestori di download, che si avviano e corrono silenziosamente nella barra delle applicazioni.Come avviare l'applicazione direttamente nella barra delle applicazioni? (.NET C#)

Voglio lo stesso effetto e quando l'utente fa clic sul pulsante "mostra" del contextmenustrip del notifyIcon, l'unica applicazione dovrebbe mostrare GUI.

Sto usando questo, ma la sua non funziona

private void Form_Load(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 

Può essere Ho bisogno di avere funzione main() in qualche altra classe che non ha interfaccia grafica, ma ha NotifyIcon & ContextMenuStrip la cui opzione istanziare la GUI classe di finestre. Destra?

+0

Vedere anche questa domanda - http://stackoverflow.com/questions/807005/c-net-winforms-instantiate-a-form-without-showing-it – ChrisF

+0

Mi dispiace di gettare un argomento vecchio. Ho ottenuto tutto tranne una cosa importante. Capisco che 'Application.Run()' rinunci essenzialmente al controllo (?). Quello che voglio fare è fare in modo che il codice faccia qualcosa senza interazione dell'utente (diciamo che sta elaborando i dati e li scrive in un file). Dove dovrei inserire questo codice in modo che sia in esecuzione mentre il programma è seduto nella barra delle applicazioni? –

+0

@BarryDysert: 'Applicazione.Run() 'avvia il pump dei messaggi di Windows. Se non si dispone di questa chiamata da qualche parte, l'icona della barra delle applicazioni non funzionerà affatto. Senza sapere nulla di ciò che stai effettivamente cercando di ottenere, direi di guardare i thread, solo essere a conoscenza dei problemi che modificano le cose dell'interfaccia utente su thread diversi da quello da cui è stato chiamato 'Application.Run()'. –

risposta

27

Il modo in cui di solito messa a punto qualcosa di simile è quello di modificare il Program.cs a guardare qualcosa di simile al seguente :

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (NotifyIcon icon = new NotifyIcon()) 
     { 
      icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
      icon.ContextMenu = new ContextMenu(new MenuItem[] { 
       new MenuItem("Show form", (s, e) => {new Form1().Show();}), 
       new MenuItem("Exit", (s, e) => { Application.Exit(); }), 
      }); 
      icon.Visible = true; 

      Application.Run(); 
      icon.Visible = false; 
     } 
    } 

Con questo, non è necessario preoccuparsi di nascondere, invece di forme di chiusura e tutto il resto degli hack che possono portare a ... È possibile effettuare una forma Singleton troppo invece di istanziare un nuovo Form ogni t fai clic sull'opzione Visualizza modulo. Questo è qualcosa da cui partire, non la soluzione finale.

+1

Come ulteriore nota, è necessario utilizzare un progetto GUI, nonostante questo codice appaia prima che venga visualizzata qualsiasi GUI, altrimenti si aprirà una finestra della console, che è persino peggiore del problema originale! –

+0

Fantastico !! Questo è esattamente quello che sto cercando. Ma come cambio l'icona.Icon? Voglio mettere il mio * .ico qui. invece di quello estratto. – claws

+1

'new System.Drawing.Icon (" C: \ Path \ To \ Icon.ico ")' dalla memoria o utilizzare una risorsa (consigliata). Vedi questa altra domanda per i dettagli su come creare/utilizzare le risorse: http://stackoverflow.com/questions/90697/how-to-create-and-use-resources-in-c-net-vs-2008 –

3

È necessario impostare anche l'icona di notifica.

manualmente o tramite la barra degli strumenti (trascinare un NotifyIcon nel form) creare il NotifyIcon:

this.notifyIcon = new System.Windows.Forms.NotifyIcon(components); 

Quindi aggiungere il codice a Form_Load():

// Notify icon set up 
notifyIcon.Visible = true; 
notifyIcon.Text = "Tooltip message here"; 
this.ShowInTaskbar = false; 
this.Hide(); 

anche se questo, come è stato sottolineato, mostrare brevemente il modulo prima di nasconderlo.

Dalla risposta accettata di this question, la soluzione sembra essere quella di cambiare:

Application.Run(new Form1()); 

a:

Form1 f = new Form1(); 
Application.Run();   

in Main().

+0

In realtà ho l'installazione notifyIcon. Quindi, ho appena aggiunto il this.ShowInTaskbar = false; ma il problema è che la finestra viene visualizzata per un istante e quindi nascosta. Non voglio questo. – claws

+0

Controlla la mia soluzione quindi artigli. Questo risolverà questo problema. –

+0

Hai provato a impostare 'WindowState' su' Minimized'? – ChrisF

0

Hai creato un'applicazione Windows in C#? È necessario trascinare un controllo NotifyIcon sul modulo, il controllo verrà posizionato sotto il modulo poiché non ha alcuna rappresentazione visiva sul modulo stesso.

quindi impostare le proprietà come l'icona ...

provare questo primo ...

Problemi correlati