[C#] NotifyIcon ohne Windows-Form

Gobble-G

Lieutenant
Registriert
Nov. 2002
Beiträge
727
Hallo zusammen,

ich bin C#-Neuling und habe schon einige kleine Windows-Applikationen mit Oberfläche programmiert.
Jetzt interessiert mich eins: Wie schreibe ich einen Windows-Programmrahmen, der nicht sofort ein Form öffnet. Stattdessen soll nach Programmstart im Tray ein kleines Symbol (NotifyIcon) erscheinen, über das ich das Programm steuern kann. Zu einem späteren Zeitpunkt soll auch ein Form angezeigt werden können.

Verstanden, was ich meine? Wie geht das?

Danke und Gruß,
Gobble-G
 
Indem du das Form (heißt es "das"?) sofort beim Start versteckst, ne andre Möglichkeit fällt mir jetzt so nicht ein...Code gibts gleich, muss erstmal essen.

mfg

/edit:

Aaalso. Mir ist noch ne Möglichkeit eingefallen. Man könnte auch für das Icon eine extra Klasse machen und alle eigenschaften des Forms so setzen, dass es praktisch unsichtbar ist. (Seehr unschön, aber irgendwie kann ich es grad nicht anders verstecken)
Das andre Form startet man dann halt erst wenn man's braucht.
Blöd, aber mir fällt nix besseres ein...
 
Zuletzt bearbeitet:
Danke für deine Antwort. So in der Art hatte ich es schon probiert. Aber schon das Verstecken nach dem Anzeigen gestaltet sich etwas schwierig und man sieht es eben doch ganz kurz.

Ich hatte auch schon probiert "Application.Run();" ohne Paramter ("new Form1()") zu starten und einfach zu einem späteren Zeitpunkt eine Form1 zu instanziieren und mit Show() oder ShowDialog() anzuzeigen. Allerdings wollte sich dieses Objekt gar nicht auf den Bildschirm bringen lassen.

Fällt dir in dieser Richtung vielleicht noch was ein?


Edit: Achja, was passiert da eigentlich genau bei Run()? Ich hätte vermutet, dass es letztlich auch nur die Show()-Methode des Forms aufruft und es so sichtbar macht. Aber selbst wenn ich die Show()- und ShowDialog()-Methoden in Form1 überschreibe, wird das Form angezeigt.
 
Zuletzt bearbeitet:
Ein neuer Post für eine gute Lösung:

Ich habe mich nochmals mit der Run()-Methode beschäftigt und die Überladung mit ApplicationContext näher betrachtet. Genau hier liegt eine gute Lösung, wie ich finde.

Statt des Aufrufs von Run() mit einer Instanz des Forms selbst, wird nun eine Instanz einer eigenen von ApplicationContext abgeleiteten Klasse an Run() übergeben. Im Konstruktor dieser Klasse kann man ein Form instaziieren, dass ein NotifyIcon beinhaltet. Über dieses NotifyIcon kann ich letztlich das Formular steuern; also anzeigen, verstecken, schließen, etc..

Alles im eigenen Form funktioniert wie gehabt. Selbst den Designer des VS kann man weiterhin benutzen. Einzig das Schließen des Programms muss man etwas anders behandeln, da sich durch Close() oder Dispose() nur das Form auflöst. Die ApplicationContext läuft weiter. Eine schöne Lösung hier ist, das Event Closed des Forms abzufangen und ExitThread() aufzurufen.

Hier die Main()-Methode:
Code:
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new AppContext());
        }

Hier meine AppContext-Klasse:
Code:
    class AppContext: ApplicationContext
    {
        public AppContext()
        {
            Form1 myForm = new Form1();
            myForm.Closed += new EventHandler(myForm_Closed);
        }

        private void myForm_Closed(object sender, EventArgs e)
        {
            ExitThread();
        }
    }

Jo, das wärs. Über dieses Verfahren lassen sich auch gut mehrere "gleichberechtigte" Forms verarbeiten und getrennt voneinander öffnen und schließen.

MfG, Gobble-G
 
Jup, sieht gut aus :daumen:
Werd ich sicher auch irgendwann mal wieder brauchen können.
Trotzdem...ich hatte das schonmal anders gelöst..fällt mir nur nimmer ein... aber egal, dein Problem ist ja gelöst.

mfg
 
Zurück
Oben