Come posso creare un'applicazione .NET Windows Form che viene eseguita solo nella barra delle applicazioni?


216

Cosa devo fare per eseguire un'applicazione Windows Form nella barra delle applicazioni?

Non un'applicazione che può ridurre a icona il vassoio, ma che esiste solo nel vassoio, con nient'altro che un'icona, un suggerimento e il menu "clic destro".



9
Manca qualcosa nella maggior parte delle risposte: non dimenticare di impostare icon.Visible = false, quindi Dispose()l'icona quando si esce dall'applicazione. Altrimenti vedrai comunque l'icona dopo la chiusura del programma. Dopo averlo provato un paio di volte, non saprai più quale icona è reale.
Tomasz Gandor,

Se stai cercando un approccio WPF più moderno, puoi provare questo: codeproject.com/Articles/36788/…
Murray Foxcroft

Risposte:


86

L'articolo del progetto di codice Creazione di un'applicazione Tasktray fornisce una spiegazione e un esempio molto semplici della creazione di un'applicazione che esiste sempre e solo nella barra delle applicazioni.

Fondamentalmente cambia la Application.Run(new Form1());linea in Program.csper avviare invece una classe che eredita da ApplicationContext, e fare inizializzare a il costruttore per quella classeNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}

13
Questo è un ottimo punto di partenza. Si noti che "AppIcon" deve essere il nome di una risorsa che si aggiunge con "Progetto -> Proprietà -> Risorse -> Aggiungi risorsa", quindi ricompilare il progetto.
Lavamantis,

1
Ho fatto properties..resources..add resource..icon .. ricompilato, ricevo ancora "Errore CS0103 Il nome" Risorse "non esiste nel contesto corrente"
barlop

@barlop Ho dovuto scriverlo in questo modo: Properites.Resources.AppIcon
Simon Perepelitsa

@SimonPerepelitsa grazie, non sono sicuro di cosa ho fatto nei miei esperimenti, intendevo commentare ciò che ha funzionato, ma devo aver dimenticato alcune delle cose che ho fatto che hanno funzionato. Ma alla fine il metodo che ho usato è stato trascinare un'icona di notifica dalla tavolozza delle cose su cui puoi trascinare. Quindi facendo clic su di esso nel modulo, facendo clic su una piccola freccia che fa apparire un menu per scegliere un'icona per esso!
barlop

17

Come dice mat1t - devi aggiungere un NotifyIcon alla tua applicazione e quindi usare qualcosa come il seguente codice per impostare la descrizione comandi e il menu contestuale:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

Questo codice mostra l'icona nella barra delle applicazioni:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

Quanto segue sarà necessario se si dispone di un modulo (per qualsiasi motivo):

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

Il clic destro per ottenere il menu di scelta rapida viene gestito automaticamente, ma se si desidera eseguire alcune azioni con un clic sinistro, è necessario aggiungere un gestore clic:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

15

Ho scritto un'app traybar con .NET 1.1 e non avevo bisogno di un modulo.
Prima di tutto, imposta l'oggetto di avvio del progetto come Sub Main, definito in un modulo.
Quindi creare a livello di codice i componenti: il NotifyIcone ContextMenu.
Assicurati di includere un MenuItem"Esci" o simile.
Associa il ContextMenual NotifyIcon.
Invoca Application.Run().
Nel gestore dell'evento per Esci MenuItemassicurati di chiamare set NotifyIcon.Visible = False, quindi Application.Exit(). Aggiungi ciò di cui hai bisogno ContextMenue gestisci correttamente :)


11
  1. Crea una nuova applicazione Windows con la procedura guidata.
  2. Elimina Form1dal codice.
  3. Rimuovere il codice in Program.cs avviando il Form1.
  4. Utilizzare la NotifyIconclasse per creare l'icona della barra delle applicazioni (assegnargli un'icona).
  5. Aggiungi un menu contestuale ad esso.
  6. Oppure reagisci al NotifyIconclic del mouse e differenzia tra clic destro e sinistro, impostando il menu di scelta rapida e mostrandolo per il quale è stato premuto il pulsante (destra / sinistra).
  7. Application.Run()per mantenere in esecuzione l'app con cui Application.Exit()uscire. O a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Quindi impostare bRunning = false;per uscire dall'app.

Il programma si interrompe quando si raggiunge la fine di Main e non ha thread dell'interfaccia utente. Come ti prendi cura di questa è la tua soluzione? Se hai risolto questi problemi, ottieni il mio voto :)
Matthew Steeples,

Ottieni il mio voto. Forse hai solo detto che devi ancora chiamare Application.Run senza parametri?

Aggiornato con un'alternativa a App.Run.
Wolf5,

Lo so che il thread.sleep è eccessivo, ma se hai una migliore alternativa al ciclo "sleep" ad Application.Run, pubblicalo :)
Wolf5,

Thread.Sleep è una cattiva idea: finirai per utilizzare più CPU e batteria rispetto a se hai appena fatto Application.Run come previsto.
Sneftel,

8

L'applicazione "Barra delle applicazioni" è solo una normale applicazione per moduli di vincita, l'unica differenza è che crea un'icona nell'area di notifica di Windows. Per creare l'icona sys.tray utilizzare il componente NotifyIcon, è possibile trovarlo nella Casella degli strumenti (Controlli comuni) e modificarne le proprietà: Icona, descrizione comando. Inoltre, consente di gestire i messaggi di clic del mouse e doppio clic.

E un'altra cosa, al fine di ottenere un aspetto grafico o un'app per vassoio standard. aggiungi le linee followinf al tuo evento show del form principale:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

6

Per quanto ne so, devi ancora scrivere l'applicazione usando un modulo, ma non hai controlli sul modulo e non impostarlo mai visibile. Utilizzare NotifyIcon (un esempio MSDN di cui è possibile trovare qui ) per scrivere l'applicazione.


1
Non proprio. I moduli possono contenere controlli, ma dovrebbero essere nascosti per impostazione predefinita.
Rune Grimstad,

5
Non hai bisogno di alcun modulo. Dopo una nuova procedura guidata per la creazione di app per Windows, basta eliminare Form1 e rimuovere il codice aprendolo. Puoi scrivere tutto da Program.cs con NotifyIcon e ContextMenu su di esso. Niente di più richiesto.
Wolf5,

1
So che può contenere controlli, ma OP non lo vuole
Matthew Steeples,

2

Ecco come l'ho fatto con Visual Studio 2010 , .NET 4

  1. Crea un'applicazione Windows Form, imposta "Crea applicazione a istanza singola" nelle proprietà
  2. Aggiungi un ContextMenuStrip
  3. Aggiungi alcune voci alla barra del menu di scelta rapida, fai doppio clic su di esse per ottenere i gestori, ad esempio "esci" (doppio clic) -> gestore -> me.Close ()
  4. Aggiungi un NotifyIcon, nel set di progettazione contextMenuStrip a quello che hai appena creato, scegli un'icona (puoi trovarne alcuni nella cartella VisualStudio sotto 'common7 ...')
  5. Impostare le proprietà per il modulo nel designer: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacità: 0%, WindowState: Ridotto a icona
  6. Aggiungi Me.Visible = false alla fine di Form1_Load, questo nasconderà l'icona quando si utilizza Ctrl+Tab
  7. Esegui e regola se necessario.

2

È un framework molto intuitivo per l'applicazione dell'area di notifica ... è sufficiente aggiungere NotificationIcon al modulo di base e modificare il codice generato automaticamente nel codice seguente:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

-2

Aggiungi semplicemente

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

al tuo oggetto modulo. Vedrai solo un'icona nella barra delle applicazioni.


Questo mette il modulo sopra la barra delle applicazioni. Non è la stessa cosa Stai cercando di rispondere a un altro post?
LarsTech,

1
Non c'è un'icona sulla barra delle applicazioni, non vediamo il modulo. Il programma esiste visivamente solo nella barra delle applicazioni. Cosa significa sopra ?
Sì,

La tua risposta non contiene alcun contesto. Stai usando la classe NotifyIcon? In caso contrario, il modulo si riduce a icona nell'angolo in basso a sinistra sopra la barra delle attività.
LarsTech,

1
Se non sei occupato, prova a scrivere ed eseguirlo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.