Wie kann ich eine .NET Windows Forms-Anwendung erstellen, die nur in der Taskleiste ausgeführt wird?

216

Was muss ich tun, damit eine Windows Forms- Anwendung in der Taskleiste ausgeführt wird?

Keine Anwendung, die auf das Fach minimiert werden kann, sondern eine, die nur im Fach vorhanden ist und nur ein Symbol, einen Tooltip und ein Kontextmenü enthält.

xyz
quelle
9
In den meisten Antworten fehlt etwas - vergessen Sie nicht icon.Visible = false, Dispose()das Symbol beim Beenden Ihrer Anwendung festzulegen. Andernfalls wird das Symbol nach dem Beenden Ihres Programms weiterhin angezeigt. Nachdem Sie es einige Male getestet haben, wissen Sie nicht mehr, welches Symbol echt ist.
Tomasz Gandor
Wenn Sie nach einem moderneren WPF-Ansatz suchen, können Sie dies versuchen: codeproject.com/Articles/36788/…
Murray Foxcroft

Antworten:

85

Der Code-Projektartikel Erstellen einer Tasktray-Anwendung enthält eine sehr einfache Erklärung und ein Beispiel für das Erstellen einer Anwendung, die nur in der Taskleiste vorhanden ist.

Ändern Sie im Grunde die Application.Run(new Form1());Zeile in, Program.csum stattdessen eine Klasse zu starten, von der geerbt wird ApplicationContext, und lassen Sie den Konstruktor für diese Klasse a initialisierenNotifyIcon

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();
    }
}
Fawzan Izy
quelle
13
Dies ist ein guter Ausgangspunkt. Beachten Sie, dass "AppIcon" der Name einer Ressource sein muss, die Sie mit "Projekt -> Eigenschaften -> Ressourcen -> Ressource hinzufügen" hinzufügen und dann das Projekt neu kompilieren.
Lavamantis
1
Ich habe Eigenschaften ... Ressourcen ... Ressource ... Symbol ... neu kompiliert, immer noch "Fehler CS0103 Der Name" Ressourcen "existiert im aktuellen Kontext nicht"
Barlop
@barlop Ich musste es so schreiben: Properites.Resources.AppIcon
Simon Perepelitsa
@ SimonPerepelitsa danke, ich bin nicht sicher, was ich in meinen Experimenten getan habe, ich wollte kommentieren, was funktioniert hat, aber ich muss einige der Dinge vergessen haben, die ich getan habe, die funktioniert haben. Aber letztendlich war die Methode, die ich verwendet habe, ein Benachrichtigungssymbol aus der Palette der Dinge zu ziehen, die Sie ziehen können. Klicken Sie dann im Formular darauf und klicken Sie auf einen kleinen Pfeil, der ein Menü öffnet, in dem Sie ein Symbol dafür auswählen können!
Barlop
17

Wie mat1t sagt, müssen Sie Ihrer Anwendung ein NotifyIcon hinzufügen und dann den folgenden Code verwenden, um den Tooltip und das Kontextmenü festzulegen:

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

Dieser Code zeigt nur das Symbol in der Taskleiste:

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

Folgendes wird benötigt, wenn Sie ein Formular haben (aus welchem ​​Grund auch immer):

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

Der Rechtsklick zum Aufrufen des Kontextmenüs wird automatisch ausgeführt. Wenn Sie jedoch mit einem Linksklick eine Aktion ausführen möchten, müssen Sie einen Klick-Handler hinzufügen:

    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;
        }
    }
ChrisF
quelle
15

Ich habe eine Traybar-App mit .NET 1.1 geschrieben und brauchte kein Formular.
Legen Sie zunächst das Startobjekt des Projekts als Sub fest Main, das in einem Modul definiert ist.
Erstellen Sie dann programmgesteuert die Komponenten: die NotifyIconund ContextMenu.
Stellen Sie sicher, dass Sie ein MenuItem"Beenden" oder ähnliches einfügen.
Binden Sie die ContextMenuan die NotifyIcon.
Rufen Sie auf Application.Run().
Im Ereignishandler für das Beenden MenuItemsicher seinen Satz zu nennen NotifyIcon.Visible = False, dann Application.Exit(). Füge hinzu, was du brauchst ContextMenuund handhabe es richtig :)

M. Turini
quelle
10
  1. Erstellen Sie mit dem Assistenten eine neue Windows-Anwendung.
  2. Löschen Form1Aus dem Code .
  3. Entfernen Sie den Code in Program.cs, um das zu starten Form1 .
  4. Verwenden Sie die NotifyIcon Klasse, um das Taskleistensymbol zu erstellen (weisen Sie ihm ein Symbol zu).
  5. Fügen Sie ein Kontextmenü hinzu.
  6. Oder reagieren auf NotifyIcon den Mausklick und unterscheiden Sie zwischen Rechts- und Linksklick, stellen Sie Ihr Kontextmenü ein und zeigen Sie an, für welche Taste (rechts / links) gedrückt wurde.
  7. Application.Run()um die App am Laufen zu halten Application.Exit(). Oder a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Stellen Sie dann ein bRunning = false;, um die App zu beenden.
Wolf5
quelle
Das Programm wird nicht mehr ausgeführt, wenn Sie das Ende von Main erreicht haben und hat keinen UI-Thread. Wie sorgen Sie dafür, dass dies Ihre Lösung ist? Wenn Sie diese Probleme gelöst haben, erhalten Sie meine Stimme :)
Matthew Steeples
Du bekommst meine Stimme. Erwähnen Sie vielleicht nur, dass Sie Application.Run noch ohne Parameter aufrufen müssen?
Aktualisiert mit einer Alternative zu App.Run.
Wolf5
Der thread.sleep ist übertrieben, ich weiß, aber wenn Sie eine bessere "Schlaf" -Schleifenalternative zu Application.Run haben, posten Sie es :)
Wolf5
Thread.Sleep ist eine schlechte Idee: Sie werden am Ende mehr CPU und Akku verbrauchen, als wenn Sie gerade Application.Run ausgeführt hätten, wie Sie es sollen.
Sneftel
8

Die Anwendung "Taskleiste" ist nur eine reguläre Win Forms-Anwendung. Der einzige Unterschied besteht darin, dass im Windows-Taskleistenbereich ein Symbol erstellt wird. Um ein sys.tray-Symbol zu erstellen, verwenden Sie die NotifyIcon-Komponente. Sie finden sie in der Toolbox (Allgemeine Steuerelemente) und ändern ihre Eigenschaften: Symbol, QuickInfo. Außerdem können Sie Mausklick- und Doppelklicknachrichten verarbeiten.

Und noch etwas, um ein Erscheinungsbild und eine Standard-Tray-App zu erzielen. Fügen Sie Ihrem Hauptformular-Show-Event folgende Info-Zeilen hinzu:

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

Soweit mir bekannt ist, müssen Sie die Anwendung immer noch mit einem Formular schreiben, aber keine Steuerelemente für das Formular haben und es niemals sichtbar machen. Verwenden Sie das NotifyIcon (ein MSDN-Beispiel davon finden Sie hier ), um Ihre Anwendung zu schreiben.

Matthew Steeples
quelle
1
Nicht ganz. Ihre Formulare können Steuerelemente enthalten, sollten jedoch standardmäßig ausgeblendet sein.
Rune Grimstad
5
Sie brauchen kein Formular. Löschen Sie nach einem neuen Assistenten zum Erstellen von Windows-Apps einfach das Formular1 und entfernen Sie den Code, der es öffnet. Sie können alles aus Program.cs mit NotifyIcon und ContextMenu schreiben. Nichts mehr erforderlich.
Wolf5
1
Ich weiß, dass es Steuerelemente enthalten kann, aber OP will es nicht
Matthew Steeples
2

So habe ich es mit Visual Studio 2010 , .NET 4 gemacht

  1. Erstellen Sie eine Windows Forms-Anwendung, und legen Sie in den Eigenschaften die Option "Einzelinstanzanwendung erstellen" fest
  2. Fügen Sie einen ContextMenuStrip hinzu
  3. Fügen Sie dem Kontextmenü einige Einträge hinzu, doppelklicken Sie darauf, um die Handler zu erhalten, z. B. 'exit' (Doppelklick) -> handler -> me.Close ()
  4. Fügen Sie ein NotifyIcon hinzu, und wählen Sie im Designer-Set contextMenuStrip ein Symbol aus (einige finden Sie im VisualStudio-Ordner unter 'common7 ...').
  5. Legen Sie im Designer Eigenschaften für das Formular fest: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. Fügen Sie Me.Visible = false am Ende von Form1_Load hinzu. Dadurch wird das Symbol bei Verwendung von Ctrl+ ausgeblendetTab
  7. Führen Sie es aus und passen Sie es nach Bedarf an.
Entwickelt
quelle
2

Es ist ein sehr benutzerfreundliches Framework für die Notification Area-Anwendung. Es reicht aus, NotificationIcon zum Basisformular hinzuzufügen und automatisch generierten Code in den folgenden Code zu ändern:

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;
        }
    }
}
Sebastian Xawery Wiśniowiecki
quelle
-2

Einfach hinzufügen

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

zu Ihrem Formularobjekt. In der Taskleiste wird nur ein Symbol angezeigt.

YTerle
quelle
Dadurch wird das Formular über der Taskleiste angezeigt. Nicht dasselbe. Versuchen Sie, auf einen anderen Beitrag zu antworten?
LarsTech
1
Es gibt kein Symbol in der Taskleiste, wir sehen keine Form. Das visuelle Programm ist nur in der Taskleiste vorhanden. Was bedeutet oben ?
YTerle
Ihre Antwort enthält keinen Kontext. Verwenden Sie die NotifyIcon-Klasse? Wenn nicht, wird Ihr Formular nur in der unteren linken Ecke über der Taskleiste minimiert.
LarsTech
1
Wenn Sie nicht beschäftigt sind, versuchen Sie bitte, es zu schreiben und auszuführen.
YTerle